2012-11-27 21 views
5

Mam schemat dziedziczenia jak poniżej:abstrakcyjna klasa dziedziczy inną klasa abstrakcyjna problem

public abstract class BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public abstract class BaseFileAttachment:BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public class ExchangeFileAttachment:BaseFileAttachment 
{ 
    string name; 
    public override string GetName() 
    { 
     return name; 
    } 
} 

Zasadniczo chcę zadzwonić() metoda getName klasy ExchangeFileAttachment; Powyższa deklaracja jest jednak błędna. Każda pomoc z tego jest doceniana. Dzięki

+1

Czy masz zamiar dostarczyć całkowicie nową metodę 'GetName' na' BaseFileAttachment', która zawiera definicję 'BaseAttachment.GetName'? Jeśli nie, po prostu pomiń redeclaration. –

+0

Dlaczego "ExchangeFileAttachment" zostało zadeklarowane jako "abstract"? –

+2

"Jednakże powyższa deklaracja jest błędna" Powinieneś podać więcej szczegółów w swoich pytaniach. Czy to się nie kompiluje? Czy nie robi to, czego pragniesz? Jeśli tak, jakie są błędy lub niepożądane zachowania? – Servy

Odpowiedz

19

Dwa natychmiastowe problemy widzę to, że ostateczna ExchangeFileAttachment klasa jest zadeklarowana abstract, więc nigdy nie będzie w stanie jej wystąpienia. Jeśli nie masz innego poziomu dziedzictwa, którego nam nie pokazujesz, wywołanie go nie będzie możliwe - nie ma sposobu, aby uzyskać do niego dostęp. Innym problemem jest to, że BaseFileAttachment ma właściwość, która ukrywa GetName() w . W strukturze, którą nam pokazujesz, jest ona zbędna i można ją pominąć. Tak więc, „poprawione” kod będzie wyglądał bardziej jak:

public abstract class BaseAttachment 
{ 
    public abstract string GetName(); 
} 

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

public class ExchangeFileAttachment : BaseFileAttachment 
{ 
    string name; 
    public override string GetName() 
    { 
     return name; 
    } 
} 

kładę rozwiązany w cudzysłowie, bo to use-case nadal nie zrobić mnóstwo sensie więc mam nadzieję, można podać więcej informacji, czy to ma dużo więcej sensu na końcu.

+0

Ten przykład kodu pomógł mojej odpowiedzi w zupełnie innym pytaniu! –

11

Wystarczy wyjąć ponowna od BaseFileAttachment:

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

BaseFileAttachment już dziedziczy abstrakcyjną GetName deklarację BaseAttachment. Jeśli naprawdę chcesz, aby wymienić je ponownie w BaseFileAttachment użyj override kluczowe:

public abstract class BaseFileAttachment : BaseAttachment 
{ 
    public override abstract string GetName(); // that's fine as well 
} 
+0

to działa! dzięki – stoney78us

Powiązane problemy