2012-11-27 12 views
5

ho uno schema di successione come di seguito:una classe astratta eredita un altro problema classe astratta

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

Io fondamentalmente voglio chiamare il metodo della classe ExchangeFileAttachment GetName(); Tuttavia, la dichiarazione di cui sopra è errata. Qualsiasi aiuto con questo è apprezzato. Grazie

+1

L'intento è quello di fornire un metodo 'GetName' completamente nuovo su' BaseFileAttachment' che _hides_ 'BaseAttachment.GetName'? In caso contrario, ometti la redeclaration. –

+0

Perché 'ExchangeFileAttachment' ha dichiarato' abstract'? –

+2

"Tuttavia, la dichiarazione di cui sopra è sbagliata" Dovresti davvero fornire maggiori dettagli nelle tue domande. Non viene compilato? Non sta facendo ciò che desideri? Se sì, quali sono gli errori o il comportamento indesiderato? – Servy

risposta

19

I due problemi immediati che vedo è che la classe finale ExchangeFileAttachment è dichiarata abstract, in modo da non sarete mai in grado di creare un'istanza di esso. A meno che tu non abbia un altro livello di eredità che non ci stai mostrando, chiamarlo non sarà possibile - non c'è modo di accedervi. L'altro problema è che BaseFileAttachment ha una proprietà che nasconde lo GetName() in BaseAttachment. Nella struttura che ci stai mostrando, è ridondante e può essere omesso. Quindi, il codice 'corretto' apparirebbe più come:

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

ho messo corretto tra virgolette perché questo caso d'uso continua a non fare un sacco di senso quindi spero che si può dare ulteriori informazioni, o di questo ha molto più senso da parte tua.

+0

Questo esempio di codice ha aiutato la mia risposta a una domanda completamente diversa! –

11

è sufficiente rimuovere la ridichiarazione da BaseFileAttachment:

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

BaseFileAttachment eredita già l'astratto GetName dichiarazione BaseAttachment. Se davvero si vuole parlare di nuovo in BaseFileAttachment, usare la parola chiave override:

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

questo funziona! grazie – stoney78us