C#:List 的inheritance问题

我们假设这个类在C#中:

public class LimitedList : List { private int _maxitems = 500; public void Add(T value) /* Adding a new Value to the buffer */ { base.Add(value); TrimData(); /* Delete old data if lenght too long */ } private void TrimData() { int num = Math.Max(0, base.Count - _maxitems); base.RemoveRange(0, num); } } 

编译器在“public void Add(T value)”行中给出了这个警告:

警告CS0108:’System.LimitedList.Add(T)’隐藏inheritance的成员’System.Collections.Generic.List.Add(T)’。 如果要隐藏,请使用new关键字。

我该怎么做才能避免这种警告?

谢谢你的帮助

不 – 不要在这里使用new ; 这不会给你多态性。 List不是以这种方式inheritance; 使用Collectionoverride Add InsertItem方法。

 public class LimitedCollection : Collection { private int _maxitems = 500; protected override void InsertItem(int index, T item) { base.InsertItem(index, item); TrimData(); /* Delete old data if lenght too long */ } private void TrimData() { int num = Math.Max(0, base.Count - _maxitems); while (num > 0) { base.RemoveAt(0); num--; } } } 

您可以通过在声明中添加“new”来避免此警告。

 public new void Add(T value) { ... } 

但是我认为你可能通过使用inheritance来解决这个问题。 从我的角度来看,LimitedList不是List,因为它表达了非常不同的行为,因为它对List中的数据量设置了一个硬约束。 我认为不从Listinheritance而是将List作为成员变量会好得多。

这是一个坏主意的另一个原因是,当它被视为列表时,您将无法满足您的类合同。 以下代码将使用List的Add方法而不是LimitedList。

 List list = new LimitedList(10); for ( i = 0; i < 10000; i++ ) { list.Add(i); } 

您需要将“添加”方法声明为“新”(替换)方法。 试试这个:

 public class LimitedList : List { private int _maxitems = 500; public new void Add(T value) /* Adding a new Value to the buffer */ { base.Add(value); TrimData(); /* Delete old data if length too long */ } private void TrimData() { int num = Math.Max(0, base.Count - _maxitems); base.RemoveRange(0, num); } } 

注意’添加(…’声明中的’new’关键字。

虽然,在这种情况下,您应该创建自己的实现IList接口的generics类。 希望有所帮助。

像其他人所说,你需要添加新的关键字。 原因是因为在基类(List )中,Add方法没有用关键字“virtual”标记,这基本上意味着“可覆盖”。 因此,它应标记为“新”。