Metode statis tidak dipakai seperti itu, mereka hanya tersedia tanpa referensi objek.
Panggilan ke metode statis dilakukan melalui nama kelas, bukan melalui referensi objek, dan kode Bahasa Menengah (IL) untuk memanggilnya akan memanggil metode abstrak melalui nama kelas yang mendefinisikannya, belum tentu nama kelas yang Anda gunakan.
Izinkan saya menunjukkan sebuah contoh.
Dengan kode berikut:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Jika Anda memanggil B.Test, seperti ini:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Maka kode aktual di dalam metode Utama adalah sebagai berikut:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Seperti yang Anda lihat, panggilan dibuat ke A.Test, karena itu adalah kelas A yang mendefinisikannya, dan bukan ke B.Test, meskipun Anda dapat menulis kode dengan cara itu.
Jika Anda memiliki tipe kelas , seperti di Delphi, di mana Anda dapat membuat variabel yang merujuk ke tipe dan bukan objek, Anda akan lebih banyak menggunakan metode virtual dan abstrak statis (dan juga konstruktor), tetapi mereka tidak tersedia dan dengan demikian panggilan statis non-virtual di .NET.
Saya menyadari bahwa desainer IL dapat memungkinkan kode dikompilasi untuk memanggil B.Test, dan menyelesaikan panggilan saat runtime, tetapi masih tidak virtual, karena Anda masih harus menulis semacam nama kelas di sana.
Metode virtual, dan dengan demikian yang abstrak, hanya berguna ketika Anda menggunakan variabel yang, pada saat runtime, dapat berisi berbagai jenis objek, dan karenanya Anda ingin memanggil metode yang tepat untuk objek saat ini yang Anda miliki dalam variabel. Dengan metode statis, Anda harus tetap menggunakan nama kelas, sehingga metode yang tepat untuk menelepon diketahui pada waktu kompilasi karena tidak dapat dan tidak akan berubah.
Dengan demikian, metode statis virtual / abstrak tidak tersedia di .NET.