2009-02-06 42 views
1

ICollection(T)接口的添加方法已由LinkedList(T)-類明確實施。這個集合取而代之的是AddFirst和AddLast方法(等等)。明確實現的方法映射到AddLast方法。這有一些缺點,恕我直言,沒有任何好處。這兩個主要缺點是:LinkedList(T)添加方法

  1. 因爲它需要一個Add-method,所以不能在LinkedList(T)上使用集合初始化。
  2. 如果您在方法中使用了一個List(T),並且想要將其更改爲使用LinkedList(T),您需要將所有調用更新爲Add來調用AddLast。

我想它的方式是,你應該永遠明確實現接口的成員,除非他們做沒有任何意義,當你知道具體類型。例如,如果您正在實現只讀IC​​ollection(T),則應該明確實施Add-method(並且實際上隱藏)。

是否還有其他已明確實施的方法應該不在框架中?

附註:要解決第二個問題,您可以爲LinkedList(T)類創建一個擴展方法「Add」。

回答

4

Add方法是不明確的,所以我很滿足於一個明確的執行...

Queue[<T>]Stack[<T>]有類似的行爲。

對於其他(非收集)好奇的顯式成員 - DbParameter.PrecisionDbParameter.Scale怎麼樣?

重新轉移兩者之間的問題 - 你總是可以在IEnumerable<T>上寫一個ToLinkedList<T>擴展方法。

或者 - 一個AddRange<T>擴展方法走一段很長的路要走......

static void Main() 
{ 
    var list = new LinkedList<int>(); 
    list.AddRange(1, 2, 3, 4, 5); 
} 
static void AddRange<T>(this ICollection<T> list, params T[] values) 
{ 
    foreach (T value in values) 
    { 
     list.Add(value); 
    } 
} 

EDIT),如果你希望能夠使用它作爲一個單一的你也可以用「流暢」 API表達式:

static void Main() 
{ 
    var list = new LinkedList<int>().AddRange(1, 2, 3, 4, 5); 
    // `list` is correctly a LinkedList<int> here 
} 
static TCollection AddRange<TCollection, TValue>(
    this TCollection collection, params TValue[] values) 
    where TCollection : ICollection<TValue> 
{ 
    foreach (TValue value in values) 
    { 
     collection.Add(value); 
    } 
    return collection; 
} 
+0

我想你的意思是說它對開發者來說會含糊不清?問題不在於你無法添加範圍,問題是該接口與其他ICollections不同,因此除非強制轉換爲接口,否則它們是不可互換的。 – 2009-02-06 11:34:30