2012-11-27 20 views
5

を継承し、私は以下のような継承のスキーマを持っている:抽象クラスが別の抽象クラス問題

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

は、私は基本的にExchangeFileAttachmentクラスの項目GetName()メソッドを呼び出したいです。しかし、上記の宣言は間違っています。これに関する助けに感謝します。おかげ

+1

'BaseFileAttachment'に' BaseAttachment.GetName'という全く新しい 'GetName'メソッドを提供するつもりですか?そうでない場合は、再宣言を省略してください。 –

+0

なぜ 'ExchangeFileAttachment'が'抽象 'であると宣言されていますか? –

+2

"しかし、上記の宣言は間違っています。"あなたは本当にあなたの質問にもっと詳しく述べるべきです。それはコンパイルされませんか?あなたが望むことはしていないのですか?もしそうなら、エラーや望ましくない動作は何ですか? – Servy

答えて

19

私が見る2つの当面の問題、あなたの最終ExchangeFileAttachmentクラスがabstract宣言されているということですので、あなたはそれをインスタンス化することはできないでしょう。別のレベルの継承がない限り、私たちには表示されません。それは不可能であると呼びます。アクセスする方法はありません。もう1つの問題はBaseFileAttachmentGetName()BaseAttachmentに隠しているというプロパティがあることです。あなたが私たちに示している構造では、重複して省略することができます。このユースケースはまだので、私はあなたがより多くの情報を与えることができます望んでいる感覚のトンがありませんので、

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

私は引用符で修正置くか、この:だから、「修正」コードは、より多くのようになります。あなたの最後にもっと多くの意味があります。

+0

このコード例は私の答えを全く別の質問に助けました! –

11

ちょうどBaseFileAttachmentから再宣言を削除します。

public abstract class BaseFileAttachment : BaseAttachment 
{ 
} 

BaseFileAttachmentすでにBaseAttachmentから抽象GetName宣言を継承します。あなたが本当にBaseFileAttachmentで再びそれを言及したい場合は、overrideキーワードを使用します。

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

この作品は!ありがとう – stoney78us