2009-06-23 43 views
5

en Aşağıdaki kod var diyelim:C# kalıtım

interface ISomeInterface 
{ 
    void DoSomething(); 
    void A(); 
    void B();  
} 

public abstract class ASomeAbstractImpl : ISomeInterface 
{ 
    public abstract void A(); 
    public abstract void B(); 
    public void DoSomething() 
    { 
     // code here 
    } 
} 

public class SomeImpl : ASomeAbstractImpl 
{ 
    public override void A() 
    { 
     // code 
    } 

    public override void B() 
    { 
     // code 
    } 
} 

sorun i ASomeAbstractImpl.DoSomething() yöntem böylece başka hiçbir sınıf uygulamak olabilir (nihai) mühürlü sahip olmak isteyen olmasıdır. Kod şimdi SomeImpl olarak DoSomething() adlı bir yönteme sahip olabilir ve bu çağrılabilir (bu, sanal olarak işaretlenmemiş, çünkü soyut bir sınıf aynı yöntemle yöntemi geçersiz kılmaz), ancak kesmek istiyorum SomeImpl sınıfında böyle bir yöntemin uygulanması olasılığı.

Bu mümkün mü?

cevap

9

C# içindeki yöntemler varsayılan olarak mühürlenmiştir. Ancak, hiçbiri yöntemini gizlemeyi engellemek için hiçbir şey yapamazsınız (genellikle new ile türetilmiş sınıfta aynı adı taşıyan bir yöntemi açığa çıkarma).

Veya maddenin, arayüz-yeniden gerçekleştirmenizin için:

static void Main() 
{ 
    ISomeInterface si = new EvilClass(); 
    si.DoSomething(); // mwahahah 
} 

public class EvilClass : ASomeAbstractImpl, ISomeInterface 
{ 
    public override void A() {} 
    public override void B() { } 
    void ISomeInterface.DoSomething() 
    { 
     Console.WriteLine("mwahahah");    
    } 
} 
2

tüm yöntemler varsayılan olarak kapalı, ancak üye gizleme önlemenin bir yolu yok edilir.

C# derleyici, bir üyeyi her kaydettiğinizde bir derleyici uyarısı verir, ancak bunun dışında, bunu engelleyemezsiniz.

+5

Sadece kaza ile yaparsanız bir uyarı verir; "yeni" niteleyiciyi ekleyin ve kapatır ... –

0

sanal olarak işaretlenmeyen bir yöntem varsayılan olarak mühürlenmiştir. Türetilmiş bir sınıfta, yeni anahtar kelimesi ile "geçersiz" bir yöntemi işaretlemeniz gerekir, aksi takdirde bir derleyici uyarısı alırsınız. Süper sınıfın yöntemi sanal olarak işaretlenmişse, mühürlü geçersiz kılma'a göre kapatabilirsiniz. SomeImpl sınıfı DoSemthing yöntemi içeriyorsa

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

0

bu orijinal bir geçersiz gizler anlamına gelir.

0

Arabirimler ve soyut sınıflar ile uğraşırken, ne yapamayacağınızı ve ne yapamayacağınızı değil. Böylece, ara yüz kullanıcısı, bunları uygulayacakları yöntemler olduğunu ve soyut sınıflarınızla, bir yöntemi geçersiz kılmak için OK'yi bilmelerini sağlamak için sanal anahtar sözcüğünü kullanabileceğinizi öğrenebilirsiniz. Ancak onları çok fazla yapmaktan alıkoyamazsın. sanal anahtar kelimesini kullanmasanız bile, yeni anahtar sözcüğü ile gizleyebilirsiniz.