Статические методы не создаются как таковые, они просто доступны без ссылки на объект.
Вызов статического метода выполняется через имя класса, а не через ссылку на объект, и код Intermediate Language (IL) для его вызова вызовет абстрактный метод через имя класса, который его определил, а не обязательно имя класс, который вы использовали.
Позвольте мне показать пример.
Со следующим кодом:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Если вы звоните B.Test, вот так:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Тогда фактический код внутри метода Main выглядит следующим образом:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Как видите, вызов сделан в A.Test, потому что его определил класс A, а не B.Test, даже если вы можете написать код таким способом.
Если у вас были типы классов , как в Delphi, где вы можете создать переменную, ссылающуюся на тип, а не на объект, вы бы больше использовали виртуальные и, следовательно, абстрактные статические методы (а также конструкторы), но они недоступны и таким образом, статические вызовы не являются виртуальными в .NET.
Я понимаю, что конструкторы IL могут позволить скомпилировать код для вызова B.Test и разрешить вызов во время выполнения, но он все равно не будет виртуальным, так как вам все равно придется написать какое-то имя класса.
Виртуальные методы и, следовательно, абстрактные, полезны только в том случае, если вы используете переменную, которая во время выполнения может содержать множество различных типов объектов, и, таким образом, вы хотите вызвать правильный метод для текущего объекта, который у вас есть в переменной. Со статическими методами вам все равно нужно пройти через имя класса, поэтому точный метод для вызова известен во время компиляции, потому что он не может и не будет меняться.
Таким образом, виртуальные / абстрактные статические методы не доступны в .NET.