2009-07-17 107 views

回答

8

後者給你的功能,它需要一個myList,而不是一個List。這也意味着,如果myList的類型發生變化(可能是排序列表),則不必在任何地方更改代碼。所以,不要在任何地方聲明List<myType>,然後不得不改變它們,如果你在任何地方都有MyList的對象,那你就是金。

它也是一個語法差異。 myList 的一個清單,還是的清單?

如果在程序中通常使用MyList : List<MyType>,我會傾向於使用MyList : List<MyType>

+0

這裏沒有什麼區別。 *兩個*都是列表。如果你想要有一個,你會寫更類似的東西:`public class MyList {private List mytypes = new List (); }` – hughdbrown 2009-11-15 00:48:35

2

後者是一個從基地繼承的新類,但是是不同的。最明顯的區別是它沒有相同的構造函數,但是你也會遇到流式處理的問題。

這些都是缺點。好處是你可以添加一些你自己的方法。即使那樣,我也會考慮使用遏制,而不是is-a。

+0

在C#3,您可以使用擴展方法來添加方法列出,這樣的優勢是不再有效。 – 2009-07-17 16:24:10

+0

一半是真的。你可以添加方法,但是它們實際上是靜態的,所以如果你想要依賴額外的基礎字段的方法,你會被繼承。 – 2009-07-17 16:48:33

3

列表<的MyType > myList中是一般類型列表的一個實例可以包含那些的MyType的項目(或從的MyType衍生的任何類型的)

var myTypeInstance = new MyType(); 
var myList = new List<MyType>; 
myList.Add(myTypeInstance); 

myList中:列表<的MyType >是繼承列表的一種新類型,然後您可以創建多個實例:

var myTypeInstance = new MyType(); 
var myCollectionVariable = new myList(); 
myCollectionVariable.Add(myTypeInstance); 

後者優於前者的主要優點是,如果您希望某些方法可以在列表中執行操作,則可以將它們放在班級上,而不是將其存儲在「幫助程序」或「實用程序」庫中,例如:

class myList : List<MyType> 
{ 
    public void DoSomethingToAllMyTypesInList() 
    { 
    ... 
    ... 
    } 
} 
1

有些人發現從應用程序邏輯中抽象出數據結構是有好處的。如果您決定通用列表不再是代表MyList的最佳數據結構,那麼您可以更改MyList實現,並且只要您的接口相同,就不必更新任何其他代碼。

然而,這在很多情況下都會被殺死。

使用抽象數據類型而非原始數據類型也有語義上的好處,儘管列表類型模糊了該行。使用字典數據結構時更明顯。如果以自定義集合類型封裝字典,並將鍵和值公開爲屬性。您可以編寫更像您正在實施的業務邏輯的代碼。

2

我寧願不繼承性實現成爲可能。它有它的用途,但如果不是完全必要的話,那就不值得。

您的問題的主要答案是,通過繼承List<T>,您默認情況下將其所有方法設爲公共。通常當寫一個新的類時,你需要封裝。你不想讓內部泄漏。例如,假設你想創建一個線程安全的容器。如果您繼承了一個不知道線程的容器,那麼您的客戶將能夠使用基類的公共接口繞過您試圖放入的任何鎖定。

另一個流行的錯誤是當您發現自己使用特定的容器型式很多,這是很有誘惑力的嘗試和使用繼承來作一個簡短的名字吧:

class ShortName : Dictionary<string, List<string>> { }; 

但是,這不是你做了什麼 - 你已經創建了一個全新的類型。這意味着如果你有一些其他的庫可以產生正確的數據結構,它將不會被你的代碼直接使用;您必須首先將其複製到ShortName。 Linq就是一個例子,它可以從一個非常易讀的功能表達式中輕鬆構建一個Dictionary<string, List<string>>,以ToDictionary結尾。

所以取而代之,這樣做:

using ShortName = Dictionary<string, List<string>>; 

現在您對unweildy類型名稱短活潑的別名,但你居然還在使用相同類型的。

+0

使用Linq的ToDictionary或ToList時尤爲有用 – eitanpo 2013-11-27 15:59:13

2

Microsoft的設計指南(FxCop和VS代碼分析)不建議繼承列表< T>中的公共可見類。相反,您可以按照this blog post中所述從Collection < T>繼承。

雖然這些準則不一定與私人程序集或內部類相關。

一對夫婦的原因,你可能想從收藏< T>或列表<牛逼繼承>是:

  • 所以,你可以自定義應用程序特定的成員添加到您的收藏類。所以你可以創建一個ComVisible集合類(你不能直接向COM公開一個通用列表,但是你可以公開一個派生類)。

順便提一下命名準則也建議你用「集合」後綴命名你的派生類,即

MyTypeCollection : List<MyType> // or : Collection<MyType>, IList<MyType> 

而不是

MyList : List<MyType> // or : Collection<MyType>, IList<MyType> 
相關問題