2009-10-26 73 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>添加不能被覆写,因此,首要的称为可能性被有意删除