2009-10-26 67 views
4

我不能重載List的Add方法嗎?覆蓋列表<T>的添加()

class ListDemo<T>:List<T> 
{ 
    public override T Add<T>(T value) 
    { 
     return base.Add(value); 
    } 
} 

我收到以下錯誤:

1)類型參數 'T' 具有相同的名稱作爲從外類型的類型參數 'CollectionsExample.ListDemo

2)' CollectionsExample.ListDemo 。新增(T)「:發現重寫

+6

你爲什麼繼承'List '而不是僅僅實現IList (並且支持合成而不是繼承)? – 2009-10-26 17:17:38

+0

此外,確切的複製:http://stackoverflow.com/questions/580202/how-to-i-override-listts-add-method-in-c – 2009-10-26 17:22:15

+0

@ Daniel Pryden。謝謝。我是初學者。向你學習。 – user196546 2009-10-26 17:38:53

回答

13

而不是從List<T>繼承,你應該封裝List<T>和實施IList<T>。這使得它易於處理「壓倒一切」添加的行爲:

public class ListDemo<T> : IList<T> 
{ 
    private List<T> list = new List<T>(); // Internal list 
    public void Add(T item) 
    { 
     // Do your pre-add logic here 
     list.Add(item); // add to the internal list 
     // Do your post-add logic here 
    } 

    // Implement all IList<T> methods, just passing through to list, such as: 
} 

List<T>不應該是你的公共API的一部分 - 它應該是一個實現細節。

+8

'系列'是一個可定製的實現,由'List '支持,因此應該認真考慮重新編譯代碼以保持簡單性(並將注意力集中在與'List ' )。 – 2009-10-26 17:35:49

5

正確的代碼沒有合適的方法是:

class ListDemo<T>:List<T> 
{ 
    public new void Add(T value) 
    { 
     base.Add(value); 
    } 
} 

您不需要類聲明和方法上的類型參數。在這種情況下,類聲明是通用的;所以當你試圖將Add方法聲明爲一個名爲T的泛型類型參數時,編譯器會抱怨你試圖擁有2個具有相同名稱的類型參數。

編輯:修復了代碼示例。由於Add不是虛擬的,因此不能用override關鍵字覆蓋(因此原始示例實際上不會編譯)。你仍然可以使用new聲明它,但這可能會導致Add方法的不同含義。正如評論中所建議的那樣,我會強烈考慮實施IList <T>。

+1

你是對的,這段代碼會編譯。但是因爲'List.Add()'沒有被聲明爲虛擬的,所以如果你在代碼中使用這個'ListDemo'類,那麼期望'List'的代碼會覆蓋'Add()'方法。 – 2009-10-26 17:23:48

+0

這會警告。你應該使用新的,而不是覆蓋,但這不會做你期望的... – 2009-10-26 17:27:02

+2

-1 - 這是不正確的。列表 .Add不標記爲虛擬,因此您的解決方案將無法工作。 – 2009-10-26 17:31:17

0

從列表導出不是毫無意義的,如果這是給你所需要的類。和所有你想要做的就是添加一些方法,如FindCar(Car dodge).

2

這爲我工作(基於山姆哈威爾的評論):

-1

如果你想在你想要的集合覆蓋您的添加/插入或索引,那麼你可以建立自己的最愛,將繼承:

Collection<T> 

,並覆蓋下列方法:

InsertItem(); 
SetItem(); 

第一個是通過添加()和插入(), 稱爲而第二個是由該[]

由於收集用於性能比較所作的List<T>添加不能被覆寫,因此,首要的稱爲可能性被有意刪除