SORU
1 EYLÜL 2010, ÇARŞAMBA


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
1 EYLÜL 2010, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobinire

    bobinire

    24 EYLÜL 2006
  • Pepsi

    Pepsi

    1 Kasım 2005
  • The White House

    The White Ho

    21 Ocak 2006