我需要专门的集合类。我们称它们为FooItems和BarItems。
我基本上需要List的所有功能,但是当我从集合中添加或删除新项目时,我需要做一些额外的工作。
我的第一个尝试是简单地从List和List派生,然后创建我自己的Add和Remove方法。这当然创建了一个隐藏副作用的函数,编译器建议使用“new”关键字来明确隐藏基类。
public class FooCollection : List<Foo>
{
public new void Add(Foo foo)
{
// Do my work then...
base.Add(foo);
}
}
但这感觉很臭。如果有人通过List或IList引用引用FooCollection,这可能会导致问题,因为它不会调用我的(非虚拟)Add函数,而是调用List版本。
当然,在我目前的代码中,这不太可能发生......但人们永远无法预测未来。
另一个选择,当然是重新实现IList接口并包含List,但是DRY违规的臭味(这也是很多工作,特别是对于多个集合)。
我已经倾向于将遏制作为首选方法..只是想知道是否有其他人对此有一些意见。
答案 0 :(得分:4)
在这种情况下喜欢构图。
您应该实现IList<T>
,但不要在任何公共API中直接公开List<T>
(包括通过继承)。它应该是一个实现细节。
答案 1 :(得分:3)
我同意这种气味,并建议收容。如果您需要IList<T>
中的所有功能,那么就保持简单而言,您可能会运气不好。您可以使用ICollection<T>
代替吗?
已编辑如果您需要多次执行此操作,则始终可以使用虚拟实施创建MyList<T> : IList<T>
。至少那时你只需要实现大部分界面。