假设我有一个具有多个类的应用程序(使用了继承)
现在有一天,我必须向应用程序中添加新规范,这将要求我使用多重继承。
例如此代码:
class A{};
class B : public A{};
class C : public A{};
现在,我的新功能将要求我执行以下操作:
class D{} : public B,public C{};
但这将导致菱形继承(钻石问题)。
所以我的问题是,如何克服这个问题:
1)作为最佳实践,假设将来可能需要使用多重继承,我将对所有类都使用虚拟继承。
要么
2)我将只更改我的代码,在需要时使我的基类虚拟化?
最佳答案
解决此问题的一种好方法是将试图从类中获得的行为分解为组件。
现在你有这样的情况
class A {}
class B : public A {some behavior X}
class C : public A {some behavior Y}
class D : public ? {I need X and Y plus some behavior Z}
解决此问题的一种方法(可能是错误的)是仅从B或C扩展,然后从另一种复制所需的行为,但这就是复制代码。
您可能能够做的就是将您的行为变成组件:
class Behavior {void behave() = 0}
这将是一个纯虚拟类,我们可以将其称为接口(interface)。然后,您可以执行以下操作:
class BehaviorX : public Behavior {void behave(){behavior x}}
class BehaviorY : public Behavior {void behave(){behavior y}}
class BehaviorZ : public Behavior {void behave(){behavior z}}
这将允许您创建从A扩展的新类,但您可以选择它们具有的行为:
class D : public A {BehaviorX, BehaviorY, BehaviorZ, ...}
如果您真的想将组件建模提高到一个新的水平,则可以摆脱使子类全部组合在一起的麻烦,而只需将A类用作组件包,它可以使用您可以梦想的任何数量的行为,然后您就可以制作新的了。您想要的任何地方的“类”只有您想要他们的行为:
A likeB = new A(BehaviorX);
A likeC = new A(BehaviorY);
A likeD = new A(BehaviorX, BehaviorY, BehaviorZ);
A likeE = new A(BehaviorY, BehaviorZ, Behavior?);
关于c++ - 我想扩展当前应用程序功能时的DIAMOND情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41823925/