2014-12-06 55 views
2

我有一個接口層次結構,我試圖使用適當的.net xml註釋文檔。我有一個層次結構中的所有接口共享的方法,我在頂層聲明,我想對子接口給出更具體的評論。我可以在C#中的子接口中覆蓋父接口方法嗎?

換句話說,這樣的事情:

public interface IAnimal 
{ 
    /// <summary>Returns a string often spoken by this animal.</summary> 
    string speak(); 
} 

public interface IDog : IAnimal 
{ 
    /// <summary>Returns a string representation of some barking noise.</summary> 
    string speak(); 
} 

public interface IDuck : IAnimal 
{ 
    /// <summary>Returns a string representation of some quacking noise.</summary> 
    string speak(); 
} 

當我嘗試編譯此我得到「方法隱藏」我敢肯定,我不想做的警告。嘗試在方法前面插入「覆蓋」和「虛擬」關鍵字會產生錯誤而不是警告。有沒有什麼辦法可以得到不同的描述來顯示子接口上的方法而不破壞類型之間的繼承關係?

+1

如果您的界面被正確定義,這應該沒有必要。 「狗」用吠聲說話,而「鴨子」用嘎嘎聲講話就是那種被實現覆蓋的東西,而不是接口。基礎的接口描述應該適用於所有派生的接口,否則你正在改變操作的語義(這應該意味着引入一個新的接口)。 – 2014-12-06 20:28:13

+0

我有一種感覺,人們會這樣說,在我的情況下,基本接口的描述確實適用於子接口,但它非常抽象。我希望子接口描述更具體。 – Ghost314 2014-12-06 20:35:39

回答

2

你的問題的簡短答案是「否」。在C#中,除非重寫派生方法,否則無法修改派生方法,並且由於無法重寫接口方法,派生接口中的任何新聲明都只會影響原始方法。

派生的接口實際上只是更多的方法,它不能以任何方式改變,擴充或調整基本定義,包括XML註釋 - 沒有地方可以放置它們。如果您使用抽象基類,當然可以,但即使只是人爲地使用抽象基類,也可以通過「覆蓋」抽象方法來簡單地調用基類。

+0

我想這是我的答案然後,我敢肯定,我可以調整我使用的工具的輸出翻譯XML到網頁顯示任何我想要的,但代碼本身可能會保持原樣。 – Ghost314 2014-12-06 20:50:50

+0

@ Ghost314:在這方面,有一個我沒有涉及的漏洞。雖然您不能在C#中重寫該方法,但是XML註釋* does *只是在隨附的XML文件中生成一個條目。如果您手動插入「新」方法的文檔,解釋這些註釋的工具可能會也可能不會做正確的事情。如果你想變得很花哨,你可以通過向類應用一個自定義屬性('XmlDocOverride(「speak」,...)')並對結果進行後處理。可能會矯枉過正,但沒有殺傷力就像矯枉過正。 – 2014-12-06 20:54:57

相關問題