2015-02-05 64 views
1

如果我創建一個類,MyWrapper,包裹從MyClass的對象List,應該從List<T>MyWrapper繼承?或者List<myClass>從列表<myType>繼承或擴展列表<myType>

或者我應該只爲List<myClass>創建一些擴展方法? 我知道這是違反從List<T>繼承的指導性,但爲什麼?

List<Point>List<T>繼承是否有任何缺點?

創建List<T>的擴展方法有什麼缺點嗎?那麼爲List<myType>創建擴展方法呢?

而對於一個擴展方法適用於列表中的一個例子是

public static void Swap<T>(this List<T> list, int firstIndex, int secondIndex) 
{...} 
+3

我可能會在列表中使用一個包裝。你的新班級不是名單。 – 2015-02-05 18:26:30

+0

肯定有一個列表T的擴展方法的缺點。沒有方法MoveTo(Point ...我投票類繼承 – Paparazzi 2015-02-05 18:29:39

+1

如果你想改變數據結構,我寧願組合繼承。 – juharr 2015-02-05 18:38:52

回答

2

你不能只添加擴展方法列表,因爲你將不能夠編寫所有類型的形狀T.如果是List<People>會怎麼樣?在這種情況下,「MoveTo」或「GetCenter」會做什麼?

是的,您應該創建一個從List繼承的新類,或者更好的是IList。

或者你可以建立你的「Point」類,然後有List<Point>,如果你想擴展方法List<Point>你可以做到這一點。

0

如果您選擇派生列表<>,最明顯的缺點是您的用戶無法「猜測」哪種方法被覆蓋,哪些方法是「按原樣」提供的。 List是非常豐富的類,尤其是當使用LINQ進行擴展時,並且它的一個自定義覆蓋可能很快就會導致誤導和bug。

如果你想提供List「as is」,有一些自定義的方法,列表擴展方法(在你的目標是你的特定類型的「T」!)可能是非常有用的,並允許保留原來的行爲列表。

用戶只有在需要時纔會啓用和使用您的擴展方法。 缺點是擴展方法中明顯的缺點:你不能做任何你想要的東西。網上有很多關於擴展方法的信息。

IHMO最好的辦法是將List(或其他可枚舉)封裝在你自己的類中。當然,T是針對你自己的情況的。 缺點是需要重新定義所有相關的方法。當然,你也可以使用特定屬性公開內部列表(或者更好的是它的只讀副本),以允許用戶直接使用它。你的類也可以實現IEnumerable。

請注意,已經有大量有用的重寫和擴展方法以及完全自定義的集合實現來改進Web上的List和其他集合類型,並且在Framework本身中(大多數集合類型被濫用,並且LINQ增加了一個很多好東西)。注意不要重新發明輪子。

+1

聲明的成員'List '都不是'virtual',所以類型I *的用戶可以*知道你重寫了哪些 - *它們都不是*。你可以隱藏其中的一些,但是你不能覆蓋任何*。 (你可以重載'ToString'和'GetHashCode',因爲'object'雖然定義了它們'虛擬'。) – Servy 2015-02-05 18:44:46

+0

我沒有提醒,但我認爲你是對的。所以我們可以問自己「重寫一個我只能擴展的類是否很好,尤其是如果這個類如此龐大」 – AFract 2015-02-05 18:47:55

+1

我沒有看到這個類的大小在這裏如何相關。 – Servy 2015-02-05 18:48:37