2009-08-19 48 views
2

我需要專門的集合類。我們稱他們爲FooItems和BarItems。在創建專門的集合時,首選繼承還是遏制?

我基本上需要列表的所有功能,但是當新的項目被添加或從集合中刪除時,我需要做一些額外的工作。

我的第一次刺傷就是簡單地從List和List派生,然後創建我自己的Add和Remove方法。這當然會創建一個函數隱藏的副作用,編譯器建議使用「new」關鍵字來明確隱藏基類。

public class FooCollection : List<Foo> 
{ 
    public new void Add(Foo foo) 
    { 
     // Do my work then... 
     base.Add(foo); 
    } 
} 

雖然這感覺很臭。如果某人通過List或IList引用引用FooCollection,這可能會導致問題,因爲它不會調用我的(非虛擬)Add函數,而是調用List版本。

當然,在我現在的代碼中,這種情況不太可能發生......但是,人們永遠無法預測未來。

當然,另一種選擇是重新實現IList接口幷包含List,但這種干擾違反(也是很多工作,特別是對於多個集合)。

我已經傾向於遏制作爲首選的方法..只是想知道是否有其他人對此有一些輸入。

回答

4

更喜歡這種情況下的組成。

您應該實施IList<T>,但不要在任何公共API中直接公開List<T>(包括通過繼承)。它應該是一個實現細節。

3

我同意這種氣味,並建議遏制。如果您需要IList<T>中的所有功能,就保持簡單而言,您可能運氣不佳。你可以使用ICollection<T>嗎?

EDITED如果您需要多次完成此操作,您始終可以使用虛擬實現創建MyList<T> : IList<T>。至少你只需要實現一次接口的大部分功能。