Neden C# yöntemleri soyut ya da sanal ilan arabirimi değil mi?
C# arabirimleri yöntemleri override
anahtar kullanmadan türetilmiş sınıf virtual
anahtar kelime, ve geçersiz kullanmadan bildirilir.
Bunun için bir sebep var mı? Sadece dili bir kolaylık olduğunu kabul ediyorum ve açıkçası CLR yorganın altında bu olayı nasıl (yöntem varsayılan olarak sanal olmayan) bilir, ama orada da diğer teknik nedenlerden dolayı.
Türetilmiş bir sınıf oluşturur burada IL:
class Example : IDisposable {
public void Dispose() { }
}
.method public hidebysig newslot virtual final
instance void Dispose() cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Example::Dispose
Yöntemi 12* final
*IL bildirilen dikkat edin.
CEVAP
Arabirimi için abstract
public
anahtar kelimeler bile eklenmesi onları ihmal çok gereksiz olurdu:
interface MyInterface {
void Method();
}
Bu CIL yöntemi virtual
abstract
işaretlenmiş.
(Java arabirim üyeleri public abstract
ilan edilmesi için izin verdiğini unutmayın).
Uygulama dersi için bazı seçenekleri vardır:
Olmayan geçersiz kılınabilir: C# sınıfı virtual
yöntemi olarak ilan etmiyor. Türetilmiş bir sınıfta geçersiz (sadece) gizli olamaz anlamına gelir. Bu CIL yöntemi arabirim türü ile ilgili polimorfizmi destek olmalı çünkü hala sanal (ama) kapalı.
class MyClass : MyInterface {
public void Method() {}
}
Geçersiz kılınabilir: Hem C# ve CIL yöntemi virtual
. Ve aşılabilir polimorfik gönderme katılmaktadır.
class MyClass : MyInterface {
public virtual void Method() {}
}
AçıkBu bir arabirim uygulamak ama ortak arabirim, arabirim yöntemleri sağlamak için bir sınıfı kendisi için bir yoldur. Yöntemi private
olacak CIL (!) ama yine de karşılık gelen arabirim türü için bir başvuru sınıf dışından çağrılabilir. Açık uygulamaları da olmayan geçersiz kılınabilir. Bu uygulama olduğunu, karşılık gelen arabirim yöntemi için özel yöntem birbirine bağlayacak CIL bir yönerge (.override
) var, çünkü bu mümkündür.
[C#]
class MyClass : MyInterface {
void MyInterface.Method() {}
}
[CİL]
.method private hidebysig newslot virtual final instance void MyInterface.Method() cil managed
{
.override MyInterface::Method
}
VB.NET da diğer uygulama sınıf, arabirim yöntemi adı.
[VB.NET]
Public Class MyClass
Implements MyInterface
Public Sub AliasedMethod() Implements MyInterface.Method
End Sub
End Class
[CİL]
.method public newslot virtual final instance void AliasedMethod() cil managed
{
.override MyInterface::Method
}
Şimdi, bu garip durum düşünün:
interface MyInterface {
void Method();
}
class Base {
public void Method();
}
class Derived : Base, MyInterface { }
Base
Derived
ilan aynı derleme, derleyici yapar Base::Method
sanal ve mühürlü (CIL), olsa bile Base
gelmez uygulamak arayüzü.
Base
Derived
farklı derlemeleri, derleme Derived
derleme, derleyici değiştirmeyecek diğer Kurul, çok daha kolay olacak takdim üye Derived
olacak bir açık uygulama MyInterface::Method
o sadece temsilci çağrısı Base::Method
.
Gördüğünüz gibi,herarabirim yöntemi uygulama polimorfik davranış desteklemesi ve böylece eğer derleyici bunu yapmak için çemberin içinden gitmek zorunda bile CIL sanal işaretlenmiş olmalıdır.
Neden C soyut bir sınıf için sanal bir...
Neden soyut bir sınıf bir arabirim uyg...
Neden't JUnit assertNotEquals yön...
Neden &; son" Java 8 arabirim yön...
Neden't değişkenleri " olarak ila...