让我们假设这个类在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)'。如果想要隐藏,请使用new关键字。
我该怎么做才能避免这种警告?
Thx 4你的帮助
答案 0 :(得分: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--;
}
}
}
答案 1 :(得分:11)
您可以通过在声明中添加“new”来避免此警告。
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);
}
答案 2 :(得分:1)
您需要将“添加”方法声明为“新”(替换)方法。 试试这个:
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);
}
}
注意'添加(...'声明。
中的'new'关键字虽然在这种情况下,您应该创建自己的实现IList接口的泛型类。 希望有所帮助。
答案 3 :(得分:0)
与其他人一样,您需要添加新关键字。这是因为在基类(List&lt; T&gt;)中,Add方法没有用关键字“virtual”标记,这基本上意味着“可覆盖”。因此,它应标记为“新”。