C#: Inheritance Problem with List<T>
Let's assume this class in 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);
}
}
The compiler gives me this warning in the line "public void Add(T value)":
warning CS0108: 'System.LimitedList.Add(T)' hides inherited member 'System.Collections.Generic.List.Add(T)'. Use the new keyword if hiding was intended.
What do I have to do to avoid this warning?
Thx 4 your help
No - don't use new
here; that doesn't give you polymorphism. List<T>
isn't intended for inheritance in this way; use Collection<T>
and override
the Add
InsertItem
method.
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--;
}
}
}
You can avoid this warning by adding "new" to the declaration.
public new void Add(T value) {
...
}
However I think you may be approaching this problem a bit wrong by using Inheritance. From my perspective LimitedList is not a List because it expresses very different behavior as it puts a hard constraint on the amount of data in the List. I think it would be much better to not inherit from List but have a List as a member variable.
Another reason why this is a bad idea is that you won't be able to satisfy your class's contract when it is viewed as a List. The following code will use the List`s Add method and not LimitedList.
List<int> list = new LimitedList<int>(10);
for ( i = 0; i < 10000; i++ ) {
list.Add(i);
}
You need to declare your 'Add' method as a 'new' (replacement) method. Try this:
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);
}
}
notice the 'new' keyword in the 'Add(...' declaration.
Although, in this instance, you should create your own generic class implementing the IList interface. Hope that helps.
链接地址: http://www.djcxy.com/p/53866.html下一篇: C#:列表<T>的继承问题