我有一个自定义类,派生自List,其中包含一个Add方法,只有在满足特定条件时才会添加。
我是否还需要覆盖AddRange方法,或者AddRange是否只是调用给定范围中每个元素的Add方法?
*:是的,在C#上下文中,new
是隐藏而不是覆盖。
List<T>
派生,而应该从Collection<T>
或直接实现IList<T>
或ICollection<T>
。事实上,List<T>
类中的Add
方法不是虚方法。List<T>.AddRange
使用Array.Copy
。public class MyCollection : Collection<string>
{
private bool IsValidItem(string item)
{
return; // Your condition : true if valid; false, otherwise.
}
// This method will be called when you call MyCollection.Add or MyCollection.Insert
protected override void InsertItem(int index, string item)
{
if(IsValidItem(item))
base.InsertItem(index, item);
}
// This method will be called when you call MyCollection[index] = newItem
protected override void SetItem(int index, string item)
{
if(IsValidItem(item))
base.SetItem(index, item);
}
}
string
替换为正确的类型。Add
更好(除了 Collection
的作者声明他们想要我使用 virtual
之外)。除了 Add
,是否还有其他调用 SetItem
或 InsertItem
的方法?如果我想使用 InsertItem
在无需验证的情况下插入元素,并使用 Add
在需要验证时插入元素怎么办? - SuperbestIList<T>
的新类。最简单的方式是继承 Collection<T>
。Collection<T>
实现了 IList<T>
并提供了四个扩展点,形式为 protected virtual
方法:InsertItem
SetItem
RemoveItem
ClearItems
因为您只需要验证添加的项目而不是删除的项目,所以只需覆盖InsertItem
和SetItem
方法。
class MyCollection:Collection<T>
{
private void ValidateItem(T item)
{
if(item is invalid)
throw new ArgumentException("Item is invalid");
}
protected override InsertItem(int index, T item)
{
ValidateItem(item);
base.InsertItem(index, item);
}
protected override SetItem(int index, T item)
{
ValidateItem(item);
base.SetItem(index, item);
}
}
IList<T>.Add
,List<T>.Add
,MyList.Add
不一致),等等。 - CodesInChaosList<T>
的集合,但仅添加有效对象,那么我不会创建自定义集合。AddIfValid(T value)
和 AddRangeIfValid(IEnumerable<T>)
或任何你喜欢的名称,只要清楚地表明扩展方法正在做什么。public static void AddIfValid(this List<T> list, T value)
{
if (/* check if value is valid here */)
list.Add(value);
}
一旦您定义了扩展,就可以像这样使用它:
myList.AddIfValid(myValue);
List<T>
的.Add
方法不是虚方法,所以我想知道你是如何覆盖它的。 - Darin Dimitrovnew
。 - SuperbestAddRange
是否调用Add
都没有关系。它肯定不会调用你隐藏的Add
,而是调用被隐藏的Add
。但是这样做是不行的。这是一个巨大的 LSP 违规。从Collection<T>
派生怎么会是“更多的工作”呢? - CodesInChaosCollection<T>
派生是实现IList<T>
的特殊情况,旨在简化您的具体问题。 - CodesInChaos