接口vs内部变量vs继承字典

本文关键字:vs 字典 继承 内部 接口 变量 | 更新日期: 2023-09-27 18:06:50

我读过

设计c#类库时,什么时候应该选择继承而不是接口?

我相信我理解is-a和must-do的关系。说了这么多,这就是我的困境。

我想实现一个键值对最可能对象的集合。我需要添加到添加和删除事件只做验证,检查重复和一些跟踪的东西。

如果我实现dictionary,那么实现所有的dictionary<>、ICollection<>、IEnumerable<>和IEnumerable似乎有点过了头。是的,大多数都是一行。

不建议从Dictionary继承,因为它从来没有被扩展过,遮蔽了Add和remove。

最后,我可以实现一个私有变量,然后公开我想要或需要的项目方法

有什么建议要走的方向吗?

接口vs内部变量vs继承字典

您应该使用组合并将字典封装在类中(私有变量选项)。这样,您只向外部世界公开对您的对象有意义的操作,而您使用字典的事实仅仅是实现细节。

如果你的类是一个具有一些特殊特征的泛型字典,你应该只实现IDictionary<,>或从Dictionary<,>继承。

最简单的方法是将IDictionary实现为实例变量,并将Add和Remove方法包装在类的Add和Remove方法中,这些方法在向字典添加或从字典中删除对象之前执行验证。

继承用于需要继承实现时。否则,如果您想继承接口,而不是实现,请使用接口。

我建议您设计一些自己的类似字典的接口,其中包含您感兴趣的功能。除此之外,我建议有一些接口纯粹是为了读取接口而存在的,还有一些接口允许读写访问。除此之外,如果你有一个只读接口,不关心特定字典是可变的还是不可变的方法将能够使用IReadableDict(由可变和不可变字典实现),而要求字典是可变的或不可变的例程将能够指定这一点。此外,分离出一些其他接口将允许协方差和逆变的最大可能性。例如,代码需要一个IReadableDict<String,>可以非常满意地使用Dict<String,>即使代码期望IReadWriteDict<String,>将无法接受Dict<String,>。同样,只需要知道字典计数的代码可以接受一个非泛型的ICountable,它公开了一个count方法,只需要知道某个键是否存在的代码可以接受一个非泛型的iqueryexist(注意,可以完全合法地检查Dict<Cat,>包含狗的一个特殊实例;答案将是"否",但问题是有效的)。