Statische Methoden werden nicht als solche instanziiert , sondern sind nur ohne Objektreferenz verfügbar.
Ein Aufruf einer statischen Methode erfolgt über den Klassennamen, nicht über eine Objektreferenz, und der IL-Code (Intermediate Language) zum Aufrufen ruft die abstrakte Methode über den Namen der Klasse auf, die sie definiert hat, nicht unbedingt über den Namen von die Klasse, die Sie verwendet haben.
Lassen Sie mich ein Beispiel zeigen.
Mit folgendem Code:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Wenn Sie B.Test wie folgt aufrufen:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Dann lautet der tatsächliche Code in der Main-Methode wie folgt:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Wie Sie sehen, wird A.Test aufgerufen, da es die A-Klasse war, die ihn definiert hat, und nicht B.Test, obwohl Sie den Code auf diese Weise schreiben können.
Wenn Sie Klassentypen wie in Delphi hätten, in denen Sie eine Variable erstellen können, die sich auf einen Typ und nicht auf ein Objekt bezieht, hätten Sie mehr Verwendung für virtuelle und damit abstrakte statische Methoden (und auch Konstruktoren), aber diese sind nicht verfügbar und Daher sind statische Aufrufe in .NET nicht virtuell.
Mir ist klar, dass die IL-Designer zulassen könnten, dass der Code kompiliert wird, um B.Test aufzurufen, und den Aufruf zur Laufzeit auflösen, aber er wäre immer noch nicht virtuell, da Sie dort immer noch einen Klassennamen schreiben müssten.
Virtuelle und damit abstrakte Methoden sind nur dann nützlich, wenn Sie eine Variable verwenden, die zur Laufzeit viele verschiedene Objekttypen enthalten kann, und Sie daher die richtige Methode für das aktuelle Objekt in der Variablen aufrufen möchten. Bei statischen Methoden müssen Sie ohnehin einen Klassennamen durchlaufen, sodass die genaue aufzurufende Methode zur Kompilierungszeit bekannt ist, da sie sich nicht ändern kann und wird.
Daher sind virtuelle / abstrakte statische Methoden in .NET nicht verfügbar.