Arayüz için abstract
, public
anahtar kelimelerin eklenmesi veya hatta anahtar kelimelerin eklenmesi gereksiz olacaktır, bu nedenle onları atlarsınız:
interface MyInterface {
void Method();
}
CIL'de yöntem işaretlenir virtual
ve abstract
.
(Java'nın arabirim üyelerinin bildirilmesine izin verdiğini unutmayın public abstract
).
Uygulama sınıfı için bazı seçenekler vardır:
Geçersiz kılınamaz : C # 'da sınıf yöntemi olarak bildirmez virtual
. Bu, türetilmiş bir sınıfta geçersiz kılınamayacağı anlamına gelir (yalnızca gizli). CIL'de yöntem hala sanaldır (ancak mühürlenmiştir) çünkü arayüz tipine ilişkin polimorfizmi desteklemesi gerekir.
class MyClass : MyInterface {
public void Method() {}
}
Geçersiz kılınabilir : Hem C # hem de CIL'de yöntem virtual
. Polimorfik gönderime katılır ve geçersiz kılınabilir.
class MyClass : MyInterface {
public virtual void Method() {}
}
Açık : Bu, bir sınıfın bir arabirim uygulaması için bir yoldur, ancak sınıfın kendi genel arabiriminde arabirim yöntemlerini sağlamaz. CIL'de yöntem private
(!) Olacaktır, ancak yine de sınıfın dışından karşılık gelen arayüz türüne bir referanstan çağrılabilir olacaktır. Açık uygulamalar da geçersiz kılınamaz. Bu mümkündür, çünkü .override
özel yöntemi uyguladığı ilgili arabirim yöntemine bağlayacak bir CIL yönergesi ( ) vardır.
[C #]
class MyClass : MyInterface {
void MyInterface.Method() {}
}
[CIL]
.method private hidebysig newslot virtual final instance void MyInterface.Method() cil managed
{
.override MyInterface::Method
}
VB.NET'te, uygulama sınıfındaki arabirim yöntemi adını bile değiştirebilirsiniz.
[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
}
Şimdi, şu garip durumu bir düşünün:
interface MyInterface {
void Method();
}
class Base {
public void Method();
}
class Derived : Base, MyInterface { }
Eğer Base
ve Derived
aynı derlemede ilan edilir, derleyici yapacak Base::Method
olsa, sanal ve (CIL olarak) mühürlü Base
arabirimini uygulamaz.
Eğer Base
ve Derived
farklı derlemeler vardır derlerken, Derived
montaj bunun bir üyesini bu yüzden tanıtacağım derleyici, diğer montaj değişmeyecek Derived
için açık bir uygulama olacağı MyInterface::Method
bu sadece çağrısı devredeceğini Base::Method
.
Gördüğünüz gibi, her arabirim yöntemi uygulaması polimorfik davranışı desteklemelidir ve bu nedenle, derleyicinin bunu yapmak için çemberlerden geçmesi gerekse bile CIL'de sanal olarak işaretlenmelidir.