Untuk antarmuka, penambahan abstract
, atau bahkan public
kata kunci akan menjadi mubazir, jadi Anda menghilangkannya:
interface MyInterface {
void Method();
}
Di CIL, metode ini ditandai virtual
dan abstract
.
(Perhatikan bahwa Java memungkinkan anggota antarmuka untuk dideklarasikan public abstract
).
Untuk kelas pelaksana, ada beberapa opsi:
Non-overridable : Dalam C # kelas tidak mendeklarasikan metode sebagai virtual
. Artinya, kelas tersebut tidak dapat diganti dalam kelas turunan (hanya tersembunyi). Dalam CIL, metode ini masih virtual (tetapi disegel) karena harus mendukung polimorfisme terkait tipe antarmuka.
class MyClass : MyInterface {
public void Method() {}
}
Dapat diganti : Baik di C # dan di CIL metodenya adalah virtual
. Ini berpartisipasi dalam pengiriman polimorfik dan dapat diganti.
class MyClass : MyInterface {
public virtual void Method() {}
}
Eksplisit : Ini adalah cara kelas untuk mengimplementasikan antarmuka tetapi tidak menyediakan metode antarmuka dalam antarmuka publik dari kelas itu sendiri. Dalam CIL, metode ini akan menjadi private
(!) Tetapi masih dapat dipanggil dari luar kelas dari referensi ke tipe antarmuka yang sesuai. Implementasi eksplisit juga tidak bisa diganti. Ini dimungkinkan karena ada direktif CIL ( .override
) yang akan menghubungkan metode privat ke metode antarmuka terkait yang diimplementasikannya.
[C #]
class MyClass : MyInterface {
void MyInterface.Method() {}
}
[CIL]
.method private hidebysig newslot virtual final instance void MyInterface.Method() cil managed
{
.override MyInterface::Method
}
Di VB.NET, Anda bahkan dapat membuat alias nama metode antarmuka di kelas implementasi.
[VB.NET]
Public Class MyClass
Implements MyInterface
Public Sub AliasedMethod() Implements MyInterface.Method
End Sub
End Class
[CIL]
.method public newslot virtual final instance void AliasedMethod() cil managed
{
.override MyInterface::Method
}
Sekarang, pertimbangkan kasus aneh ini:
interface MyInterface {
void Method();
}
class Base {
public void Method();
}
class Derived : Base, MyInterface { }
Jika Base
dan Derived
dideklarasikan dalam perakitan yang sama, kompilator akan membuat Base::Method
virtual dan tertutup (dalam CIL), meskipun Base
antarmuka tidak mengimplementasikan.
Jika Base
dan Derived
berada dalam rakitan yang berbeda, saat mengompilasi Derived
rakitan, kompilator tidak akan mengubah rakitan lain, jadi ia akan memperkenalkan anggota di dalamnya Derived
yang akan menjadi implementasi eksplisit MyInterface::Method
yang hanya akan mendelegasikan panggilan ke Base::Method
.
Jadi Anda lihat, setiap implementasi metode antarmuka harus mendukung perilaku polimorfik, dan dengan demikian harus ditandai virtual pada CIL, bahkan jika kompilator harus melalui rintangan untuk melakukannya.