2009-06-23 15 views
5

Powiedzmy mam następujący kod:C# dziedziczenie

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 
    } 
} 

Problemem jest to, że chcą mieć metoda ASomeAbstractImpl.DoSomething() uszczelnione (końcowe), więc żadna inna klasa mogła je wdrożyć. Ponieważ kod jest teraz SomeImpl może mieć metodę o nazwie DoSomething() i można ją nazwać (nie zastąpi ona metody o tej samej nazwie z klasy abstrakcyjnej, ponieważ nie jest to oznaczone jako wirtualne), ale chciałbym odciąć możliwość wdrożenia takiej metody w klasie SomeImpl.

Czy to możliwe?

Odpowiedz

9

Metody w języku C# są domyślnie zapieczętowane. Istnieje jednak nic, co można zrobić pod, aby zapobiec ukryciu metody (udostępnienie metody o tej samej nazwie w klasie pochodnej, zwykle z new).

Albo, jeśli o to chodzi, interfejs-reimplementacji:

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

Wszystkie metody są uszczelnione domyślnie, ale nie ma sposobu zapobiegania Ukrywanie państwa.

Kompilator C# wyświetli ostrzeżenie kompilatora za każdym razem, gdy ukryje członka, ale poza tym nie można mu zapobiec.

+5

Wyda ostrzeżenie tylko wtedy, gdy zrobisz to przez przypadek; dodaj "nowy" kwalifikator i zamknie się ... –

0

Metoda, która nie jest oznaczona jako wirtualna jest domyślnie zaplombowana. W klasie pochodnej musisz oznaczyć metodę "przesłaniania" słowem kluczowym nowa, w przeciwnym razie otrzymasz ostrzeżenie kompilatora. Jeśli metoda super klasy jest oznaczona jako wirtualna, można ją zamknąć na zapieczętowanej nadpisując.

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

0

jeśli klasa SomeImpl zawiera metodę DoSemthing, oznacza to, że ukrywa się oryginalny, nie zastępują.

0

Podczas pracy z interfejsami i klasami abstrakcyjnymi, bardziej chodzi o to, co MUSISZ zrobić, a nie o to, czego nie możesz zrobić. Możesz więc poinformować użytkownika interfejsu, że są to metody, które muszą wdrożyć, a ze swoimi klasami abstrakcyjnymi możesz użyć słowa kluczowego wirtualnej, aby powiadomić ich o tym, że jest OK, aby zastąpić metodę. Jednak nie możesz powstrzymać ich od robienia zbyt wiele. Nawet jeśli celowo nie użyjesz słowa kluczowego wirtualne, mogą one nadal ukrywać je za pomocą słowa kluczowego new.