【问题标题】:"Inherit not, contain" or "inherit, not contain"“不继承,不包含”或“继承,不包含”
【发布时间】:2009-01-22 08:10:59
【问题描述】:

我有一个应用程序,它产生了很多子对象,每个子对象都与一些全局应用程序对象一起工作,例如在全局应用程序注册表中注册自身,更新应用程序统计信息等。

应用程序应如何将访问这些全局对象的能力转移给子级?每个孩子都应该从静态 CRegistry 和 CStatistics 继承,还是应用程序在创建时将 Registry 和 Statistics 传递给孩子?

谢谢。

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    从 CRegistry 继承似乎很奇怪 - 子对象不仅仅是专门的注册表,是吗?他们与注册表的交互只是为了注册自己,然后在注册表中找到,我想。同上统计。

    在我看来,注册表和统计信息当然应该适当地传入(例如传入构造函数)。如果对象只需要注册然后稍后可以找到,您甚至可能不需要将注册表保留为成员变量。

    如果这确实是一个单一的全局注册表,那么可能是使用单例模式的好时机 - 尽管根据我的经验,这往往会使测试变得更加困难。

    或者,任何创建对象的东西都可以注册它们吗?它真的应该是子对象的工作吗?

    【讨论】:

    • 我自己认为在这种情况下我不应该使用继承。我正在从 C 切换到 C++ 并验证我对继承的理解。
    • 请记住,当某些东西继承时,它是“is-a”关系而不是“has-a”
    • 如果子对象应该总是被注册(如似乎表明的那样),那么是的,它应该是它的工作。如果它并不总是需要注册,那么它应该是创作者的工作。
    【解决方案2】:

    不,它们当然不应该从注册表继承。在每一个中包含一个注册表对象似乎也有点矫枉过正,而且肯定意味着大量的重复代码。

    我个人可能会选择 mixin 方法。沿着 MRegistryObjectMixin 的思路创建一个类,它封装了注册(和注销)然后继承(可能是私有的,所以你有'is-implemented-in-terms-of',而不是'is-a'语义)的过程进入所有需要注册的对象。在设计你的继承树时要小心,这样你也可以避免可怕的“死亡钻石”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2012-03-03
      相关资源
      最近更新 更多