C#:List <T>的继承问题

5 .net c# inheritance list

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

public class LimitedList<T> : List<T>
{
    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢你的帮助

Mar*_*ell 12

不 - 不要new在这里使用; 这不会给你多态性.List<T>不是以这种方式继承; 使用Collection<T>override的方法.Add InsertItem

public class LimitedCollection<T> : Collection<T>
{
    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--;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Marc,我认为即使从Collection继承也是错误的,因为它违反了一个隐含的控制.我希望通过Add添加到Collection <T>的任何内容都可用,直到我1)失去对象的控制权或2)明确删除它.LimitedCollection会违反此合同 (3认同)

Jar*_*Par 11

您可以通过在声明中添加"new"来避免此警告.

public new void Add(T value) { 
 ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

List<int> list = new LimitedList<int>(10);
for ( i = 0; i < 10000; i++ ) {
  list.Add(i);
}
Run Code Online (Sandbox Code Playgroud)