2

我需要专门的集合类。我们称它们为 FooItems 和 BarItems。

我基本上需要列表的所有功能,但是当从集合中添加或删除新项目时,我需要做一些额外的工作。

我的第一个尝试是简单地从 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 接口并包含列表,但这很容易违反 DRY(而且这也是很多工作,尤其是对于多个集合)。

我已经倾向于将收容作为首选方法......只是想知道是否有人对此有一些意见。

4

2 回答 2

4

在这种情况下更喜欢组合。

您应该在任何公共 API 中实现IList<T>,但永远不要直接公开(包括通过继承)。List<T>它应该是一个实现细节。

于 2009-08-19T21:32:32.563 回答
3

我同意这种气味,并建议遏制。如果您需要 中的所有功能IList<T>,那么就保持简单而言,您可能不走运。你可以使用,说,ICollection<T>而不是?

已编辑如果您需要多次执行此操作,您始终可以MyList<T> : IList<T>使用虚拟实现进行创建。至少那时你只实现了一次接口的大部分。

于 2009-08-19T21:34:01.640 回答