Ответ 1
(1) Статические методы нельзя переопределить, однако они могут быть скрыты с использованием ключевого слова "новое". В основном методы переопределения означают, что вы ссылаетесь на базовый тип и хотите вызвать производный метод. Поскольку static являются частью типа и не подпадают под запросы vtable, которые не имеют смысла.
например. статика не может делать:
public class Foo {
public virtual void Bar() { ... }
}
public class Bar : Foo {
public override void Bar() { ... }
}
// use:
Foo foo = new Bar(); // make an instance
foo.Bar(); // calls Bar::Bar
Поскольку статика не работает с экземплярами, вы всегда указываете Foo.Bar или Bar.Bar явно. Поэтому переопределение здесь не имеет смысла (попробуйте выразить его в коде...).
(2) Существуют разные способы использования статических методов. Например, он используется в шаблоне Singleton для получения одного экземпляра типа. Другим примером является "static void Main", который является основной точкой доступа в вашей программе.
В основном вы используете их, когда вы не хотите или не можете создать экземпляр объекта перед его использованием. Например, когда статический метод создает объект.
[обновление]
Пример простого скрытия:
public class StaticTest
{
public static void Foo() { Console.WriteLine("Foo 1"); }
public static void Bar() { Console.WriteLine("Bar 1"); }
}
public class StaticTest2 : StaticTest
{
public new static void Foo() { Console.WriteLine("Foo 2"); }
public static void Some() { Foo(); Bar(); } // Will print Foo 2, Bar 1
}
public class TestStatic
{
static void Main(string[] args)
{
StaticTest2.Foo();
StaticTest2.Some();
StaticTest.Foo();
Console.ReadLine();
}
}
Обратите внимание, что если вы создадите классы static
, вы не сможете этого сделать. Статические классы должны быть получены из object
.
Основное различие между этим и наследованием заключается в том, что компилятор может определить во время компиляции, какой метод вызывать при использовании static. Если у вас есть экземпляры объектов, вам нужно сделать это во время выполнения (это называется просмотром vtable).