“继承不,包含”或“继承,不包含”

时间:2009-01-22 08:10:59

标签: c++ inheritance

我有一个应用程序可以生成很多子对象,并且每个对象都可以处理一些全局应用程序对象,例如:在全局应用程序注册表中注册自己,更新应用程序统计信息等。

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

对我而言,这听起来像注册表和统计数据应该恰当地传入(例如进入构造函数)。如果对象只需要注册然后再找到,你甚至可能根本不需要将注册表保留为成员变量。

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

或者,无论创建对象注册了什么?它真的应该是儿童对象的工作吗?

答案 1 :(得分:0)

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

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