[英]Inheriting from List<myType> or Extending List<myType>
如果我要創建類MyWrapper
來包裝myClass中的對象List
,則MyWrapper
是否應該繼承List<T>
? 或List<myClass>
?
還是應該為List<myClass>
創建一些擴展方法? 我知道從List<T>
繼承是違反准則的,但是為什么呢?
從List<Point>
或List<T>
繼承有任何缺點嗎?
為List<T>
創建擴展方法有什么缺點嗎? 以及為List<myType>
創建擴展方法呢?
對於List有效的擴展方法的一個示例是
public static void Swap<T>(this List<T> list, int firstIndex, int secondIndex)
{...}
您不能只向List添加擴展方法,因為您將無法編寫所有類型T的形狀的代碼。如果它是List<People>
怎么辦? 在這種情況下,“ MoveTo”或“ GetCenter”會做什么?
是的,您應該創建一個繼承自List或IList的新類。
或者,您可以只為“ Point”類建模,然后創建一個List<Point>
,如果您想向List<Point>
添加擴展方法,則可以這樣做。
如果選擇派生List <>,最明顯的缺點是您的用戶無法“猜測”哪個方法被覆蓋,而哪個方法“按原樣”提供。 List是非常豐富的類,尤其是在使用LINQ擴展時,它的自定義覆蓋可能會迅速引起誤解且容易出錯。
如果您希望按“原樣”提供List,並提供一些自定義方法,則List的擴展方法(您將特定的“ T”類型作為目標!)可能會非常有用,並可以保留List的原始行為。
用戶僅在需要時才啟用和使用您的擴展方法。 缺點是擴展方法的明顯缺點:您無法在其中做任何想要的事情。 網上有很多關於擴展方法的信息。
IHMO最好的辦法是將List(或其他可枚舉的)封裝在您自己的類中。 當然,T取決於您自己的情況。 缺點是需要重新定義所有相關方法。 當然,您還可以公開具有特定屬性的內部列表(或者更好的是,它的只讀副本),以允許用戶直接使用它。 您的課程也可以實現IEnumerable。
還請注意,在Web上和Framework本身中已經有大量有用的重寫和擴展方法以及完整的自定義集合實現來改進List和其他集合類型(大多數集合類型被濫用,LINQ添加了很多好處) )。 注意不要重新發明輪子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.