我會很感激任何意見在下面的情況下去哪裏。讓我們看看我能否清楚解釋(英語不是我的母語,因此可能會讓人困惑,對不起)。接口和類的繼承。這是一種可避免的模式嗎?
假設我有以下接口:
internal interface IBlah
{
int Frob();
}
internal interface IBlahOnSteroids: IBlah
{
double Duh();
}
現在我們有一個Foo類「有」與IBlah對象關係:
public class Foo
{
IBlah blah;
internal Foo(IBlah blah)
{
this.blah = blah;
}
public int Frob()
{
....
return this.blah.Frob();
}
}
現在,我們還需要一個FooOnSteroids類與IBlahOnSteroids對象有'有'關係。 問題是,知道IBlahOnSteroids的一部分已經在Foo中實現,如果我們創建了從Foo繼承的FooOnSteroids,會發生什麼?
我們會得到這樣的事情:
public class FooOnSteroids: Foo
{
IBlahOnSteroids blah;
internal FooOnSteroids(IBlahOnSteroids blah)
:base(blah)
{
this.blah = blah;
}
public double Duh()
{
return this.blah.Duh();
}
}
這是一個推薦的模式?我們將繼承鏈傳遞給同一個'blah'對象,並且在每個「級別」我們將它存儲在私有的 字段中,並且使用'useful'類型。我沒有辦法,我可以看到,我可以在BlahBase中存儲一個受保護的屬性, 將一個常見的IBlah引用暴露給所有降序類,因爲它必須是IBlah類型,對BlahOnSteroids沒有任何用處。這種情況下甚至推薦使用 ?或者我們應該將Foo和FooOnSteroids作爲獨立的類來實現,而且沒有繼承(這會產生代碼重複)?也許它完全可以做到這一點,但它不知何故感覺像一個黑客。是嗎?
使用泛型,這將立即解決問題的選項是不可能的,因爲,是的,我知道它很爛,這個庫必須針對.Net 1.x平臺。
只是實現BlahOnSteroids的選項也是一種可能性,但這意味着根據調用者的不同,如果有任何一個IBlaOnSteroids成員被調用,我們將不得不拋出異常。我不喜歡那樣。
非常感謝您的任何建議!
我正在考慮這個確切的建議。但演員讓我感覺很簡單,因爲**我認爲**每個接口只有一個方法的例子只是爲了這個例子,實際情況可能與每個接口暴露許多方法有很大不同,案例我想知道是否攜帶額外的實例參考在整個演出中對整體情況和潛在的過度演員造成真正的區別?當然,通過提供返回演員參考的屬性可以避免演員陣容,演員陣容會更清晰。 – 2011-05-24 16:54:34
我在鑄造中看到的問題是,它已經看起來「醜陋」(沒有任何意圖),它會遍佈整個代碼(是的IFoo和IFooOnSteroids相當多的成員比1) – InBetween 2011-05-24 17:58:10