【发布时间】:2009-01-22 08:10:59
【问题描述】:
我有一个应用程序,它产生了很多子对象,每个子对象都与一些全局应用程序对象一起工作,例如在全局应用程序注册表中注册自身,更新应用程序统计信息等。
应用程序应如何将访问这些全局对象的能力转移给子级?每个孩子都应该从静态 CRegistry 和 CStatistics 继承,还是应用程序在创建时将 Registry 和 Statistics 传递给孩子?
谢谢。
【问题讨论】:
标签: c++ inheritance
我有一个应用程序,它产生了很多子对象,每个子对象都与一些全局应用程序对象一起工作,例如在全局应用程序注册表中注册自身,更新应用程序统计信息等。
应用程序应如何将访问这些全局对象的能力转移给子级?每个孩子都应该从静态 CRegistry 和 CStatistics 继承,还是应用程序在创建时将 Registry 和 Statistics 传递给孩子?
谢谢。
【问题讨论】:
标签: c++ inheritance
从 CRegistry 继承似乎很奇怪 - 子对象不仅仅是专门的注册表,是吗?他们与注册表的交互只是为了注册自己,然后在注册表中找到,我想。同上统计。
在我看来,注册表和统计信息当然应该适当地传入(例如传入构造函数)。如果对象只需要注册然后稍后可以找到,您甚至可能不需要将注册表保留为成员变量。
如果这确实是一个单一的全局注册表,那么可能是使用单例模式的好时机 - 尽管根据我的经验,这往往会使测试变得更加困难。
或者,任何创建对象的东西都可以注册它们吗?它真的应该是子对象的工作吗?
【讨论】:
不,它们当然不应该从注册表继承。在每一个中包含一个注册表对象似乎也有点矫枉过正,而且肯定意味着大量的重复代码。
我个人可能会选择 mixin 方法。沿着 MRegistryObjectMixin 的思路创建一个类,它封装了注册(和注销)然后继承(可能是私有的,所以你有'is-implemented-in-terms-of',而不是'is-a'语义)的过程进入所有需要注册的对象。在设计你的继承树时要小心,这样你也可以避免可怕的“死亡钻石”。
【讨论】: