当我想扩展当前应用程序的功能时,出现DIAMOND情况

DIAMOND situation when I want to extend the functionality of my current application

本文关键字:出现 情况 DIAMOND 功能 扩展 应用程序      更新时间:2023-10-16

假设我有一个应用程序,它有多个类(使用继承)现在有一天,我必须向我的应用程序添加新的规范,这将要求我使用多重继承。

例如这个代码:

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}

这将是一个我们可以调用接口的纯虚拟类。然后你可以做:

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?);