2012-11-27 143 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'上提供一個全新的'GetName'方法來隱藏'BaseAttachment.GetName'?如果沒有,只需省略重新聲明。 –

+0

爲什麼'ExchangeFileAttachment'聲明爲'abstract'? –

+2

「但是,上面的聲明是錯誤的」你應該在你的問題中提供更多細節。它不會編譯?它沒有做你想做的事嗎?如果是這樣,那麼錯誤或不良行爲是什麼? – Servy

回答

19

我看到的兩個直接的問題是,你的最終ExchangeFileAttachment類被聲明abstract,所以你永遠無法實例化。除非你有另一種級別的繼承,否則你沒有向我們展示,調用它是不可能的 - 無法訪問它。另一個問題是,BaseFileAttachment有一個隱藏在BaseAttachment中的GetName()的屬性。在您向我們展示的結構中,它是多餘的,可以省略。所以,「修正」的代碼看起來更象:

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