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

时间:2011-08-26 16:52:37

标签: c# collections

我已阅读

When should I choose inheritance over an interface when designing C# class libraries?

我相信我理解的是一种与必须做的关系。说完这一切就是我的困境。

我想实现一个很可能是对象的键值对的集合。我需要添加添加和删除事件只进行验证,检查重复和一些跟踪内容。

如果我实现IDictionary,那么实现所有Idictionary<>,ICollection<>,IEnumerable<>和IEnumerable似乎有点过分了。是的,大多数都是一个衬里。

不建议从Dictionary继承,因为它从未打算扩展,遮蔽添加和删除。

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

有关方向的任何建议吗?

4 个答案:

答案 0 :(得分:2)

您应该使用合成并在类中封装字典(私有变量选项)。这样,您只向外界展示对您的对象有意义的操作以及您使用字典这一事实仅仅是一个实现细节。

如果您的班级是带有一些特殊角色的通用词典,则您应该只实施IDictionary<,>或从Dictionary<,>继承。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

继承适用于需要继承实现的时间。否则,如果要继承接口,请不要实现,请使用接口。

答案 3 :(得分:0)

我建议你设计一些你自己的字典界面,其中包括你感兴趣的功能。除其他外,我建议有一些纯粹用于阅读界面的接口,还有一些允许阅读 - 写入权限。除此之外,如果你有一个只读接口,那些不关心特定字典是可变的还是不可变的方法将能够使用IReadableDict(由可变和不可变的字典实现),而例程则需要一个字典是可变的或者它是不可变的将能够指定。此外,分离出一些其他接口将允许协方差和逆变的最大可能性。例如,期望IReadableDict&lt; String,Animal&gt;的代码可能对Dict&lt; String,Cat&gt;非常满意即使代码期望IReadWriteDict&lt; String,Animal&gt;将无法接受Dict&lt; String,Cat&gt;。同样,只需要知道字典计数的代码就可以接受暴露Count方法的非泛型ICountable,而只需知道某个密钥是否存在的代码就可以接受非泛型IQueryExistence(注意一个可以完全合法地检查Dict&lt; Cat,PurrVolume&gt;是否包含Dog的特定实例;答案为'no',但问题是有效的。)