C#:列表<T>的继承问题

我们假设在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);
    }
}

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

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

我需要做些什么才能避免此警告?

Thx 4你的帮助


不 - 不要在这里使用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--;
        }
    }
}

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

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

不过,我认为你可能会通过使用继承来解决这个问题。 从我的观点来看,LimitedList不是List,因为它表达了非常不同的行为,因为它对列表中的数据量施加了严格的限制。 我认为不从List继承,但将List作为成员变量会更好。

这是一个坏主意的另一个原因是,当它被看作是一个List时,你将无法满足班级的合同。 以下代码将使用List的Add方法而不是LimitedList。

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

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

public class LimitedList<T> : List<T>
{
    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);
    }
}

在'Add(...'声明中注意'new'关键字。

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

链接地址: http://www.djcxy.com/p/53865.html

上一篇: C#: Inheritance Problem with List<T>

下一篇: What does question mark and dot operator ?. mean in C# 6.0?