2012-02-15 57 views
3

如果我有接口的其他兩個接口:在接口解決歧義延伸其具有相同名稱的方法

public interface ANewThing { IKey Key { get; } } 

public interface AnOldThing { object Key{ get; } } 

public interface ACompositeThing : ANewThing , AnOldThing { } 

,我這樣寫:

ACompositeThing compositeThing = GetCompositeThing(); 
Trace.WriteLine(compositeThing.Key); 

它不會編譯,抱怨Key的呼叫不明確(如果Key屬性返回的類型相同,則不會產生任何影響)。我知道,在實施ACompositeThing課堂上,我可以明確地實現的接口ANewThingAnOldThing,但這並不能幫助我,當我不知道具體實現,只知道他們將給予ACompositeThing方法。

所以我的問題是:

我可以做任何事情,在ACompositeThing接口說Key財產歧義應如何解決?

就像說'通過這個接口訪問Key屬性時,總是返回ANewThing實現Key屬性'?

或者我必須接受我無法做到這一點,並且在我進行訪問之前,必須始終將我的ACompositeThing投射到其他接口之一?

+0

什麼'GetCompositeThing'返回的實現看起來像什麼? – AakashM 2012-02-15 11:39:54

+0

但是實現'ACompositeThing'的類在哪裏? – vulkanino 2012-02-15 11:44:57

+0

@AakashM @vukanino在這種情況下實現是無關緊要的,我想知道當我只有一個接口時,我是如何處理這個問題的。假設有些第三方提供了'ACompositeThing'的所有實現,並且我有一個只處理'ACompositeThing'接口的庫,並且具體的實現總是傳遞給庫,所以它不知道關於它們的任何信息。 – 2012-02-15 11:59:05

回答

2

這是討厭的,但你可以在ACompositeThing聲明另一成員:

public interface ACompositeThing : ANewThing , AnOldThing { 
    new IKey Key { get; } 
} 

現在會從呼叫者的觀點偏好。但是,這意味着現在有可能不同的實現 - 並且它使用顯式接口實現爲ANewThing.Key要麼必須改變公開暴露成員,或添加到實施ACompositeThing.Key新成員的任何ACompositeThing實現。

當然,如果你的可能可以,你應該避免這種情況 - 或者只在一個非常有限的時間內從舊界面過渡到新界面。

+0

謝謝喬恩。這正是我想知道的,正是我的選擇。我們有一個較舊的庫,它曾經以對象的形式作爲Keys使用,並已將IKey實現作爲新的庫中的鍵使用,但我有一個對象需要實現來自兩個庫的接口,這是當前的問題。我們可以更新舊的圖書館,但不確定我們想要這樣做,因爲這將是一個突破性的變化。這給了我們一個止損的選擇。非常感激。 – 2012-02-15 12:03:32

0

更多的解決方法不是一個答案:請ACompositeThing是一個基類(而不是接口),明確實現Key屬性。

+0

謝謝,這可能是一個解決方法,但不是在我的情況。 – 2012-02-15 12:12:45

0

我可以在ACompositeThing接口中做任何事情來說明如何解決Key屬性模糊問題嗎?

就像說「通過這個接口訪問的關鍵屬性時,總是從ANewThing實施返回Key屬性」?

試試這個代碼:

ANewThing newThing = GetCompositeThing(); 
Trace.WriteLine(newThing.Key); 

ACompositeThing compositeThing = GetCompositeThing(); 
Trace.WriteLine(((ANewThing)compositeThing).Key); 
+1

謝謝,正如我在我的問題中所說的那樣,我意識到這一點:'或者我必須接受我無法這樣做,並且在我訪問之前必須始終將我的ACompositeThing投射到其他接口之一? – 2012-02-15 13:45:18

0

這是一個名爲 「鑽石問題」 或 「菱形繼承」 經典問題。 在大多數情況下,它出現在糟糕的OOP設計或錯誤的命名約定中。我認爲這也是你的問題。

嘗試谷歌「鑽石問題」一點,有各種解決方案。

+1

這是廢話。 「鑽石問題」是2)類的重新聚合。在這裏,我們有接口的融合,這是不同事物的不同之處。 – Val 2012-07-13 10:55:42