Los métodos estáticos no son instanciados como tales, solo están disponibles sin una referencia de objeto.
Una llamada a un método estático se realiza a través del nombre de la clase, no a través de una referencia de objeto, y el código del lenguaje intermedio (IL) para llamarlo llamará al método abstracto a través del nombre de la clase que lo definió, no necesariamente el nombre de la clase que usaste
Déjame mostrarte un ejemplo.
Con el siguiente código:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Si llamas a B.Test, así:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Entonces el código real dentro del método Main es el siguiente:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Como puede ver, la llamada se realiza a A.Test, porque fue la clase A la que lo definió, y no a B.Test, aunque puede escribir el código de esa manera.
Si tuviera tipos de clase , como en Delphi, donde puede hacer una variable que se refiera a un tipo y no a un objeto, tendría más uso para métodos estáticos virtuales y, por lo tanto, abstractos (y también constructores), pero no están disponibles y así, las llamadas estáticas no son virtuales en .NET.
Me doy cuenta de que los diseñadores de IL podrían permitir que el código se compile para llamar a B.Test y resolver la llamada en tiempo de ejecución, pero aún así no sería virtual, ya que aún tendría que escribir algún tipo de nombre de clase allí.
Los métodos virtuales, y por lo tanto los abstractos, solo son útiles cuando está utilizando una variable que, en tiempo de ejecución, puede contener muchos tipos diferentes de objetos, y por lo tanto desea llamar al método correcto para el objeto actual que tiene en la variable. Con los métodos estáticos, debe pasar por un nombre de clase de todos modos, por lo que el método exacto para llamar se conoce en tiempo de compilación porque no puede cambiar ni cambiará.
Por lo tanto, los métodos estáticos virtuales / abstractos no están disponibles en .NET.