【问题标题】:Interface vs internal variable vs inheritance dictionary接口 vs 内部变量 vs 继承字典
【发布时间】:2011-11-04 16:50:02
【问题描述】:

我读过

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

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

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

如果我实现 IDictionary,那么实现所有 Idictionary、ICollection、IEnumerable 和 IEnumerable 似乎有点过头了。是的,它们中的大多数都是一个衬垫。

不建议从 Dictionary 继承,因为它从不打算扩展,会影响添加和删除。

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

对前进的方向有什么建议吗?

【问题讨论】:

    标签: c# collections


    【解决方案1】:

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

    如果您的类是具有某些特殊特征的通用字典,您应该只实现IDictionary<,> 或从Dictionary<,> 继承。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        继承适用于需要继承实现的时候。否则,如果你想继承接口,而不是实现,使用接口。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2019-08-04
            • 2014-10-09
            • 1970-01-01
            • 1970-01-01
            • 2011-06-16
            • 1970-01-01
            • 2023-03-09
            • 1970-01-01
            • 2011-02-28
            相关资源
            最近更新 更多