【发布时间】:2019-08-05 20:32:36
【问题描述】:
我有几个我希望班级拥有的行为。我想隔离这些行为,以便我可以重用该代码,随意混合和匹配。
例如,一种方法是:
class BehaviorAbstract {
protected:
virtual void processInfo(Info i) = 0;
}
class Behavior1: public BehaviorAbstract {
protected:
virtual void processInfo(Info i) { ... }
void performBehavior1() { ... }
}
class Behavior2: public BehaviorAbstract {
protected:
virtual void processInfo(Info i) { ... }
void performBehavior2() { ... }
}
class ConcreteObject: public Behavior1, Behavior2 {
protected:
void processInfo(Info i) {
// needs to call processInfo of Behavior1 and Behavior2
Behavior1::processInfo(i);
Behavior2::processInfo(i);
}
void perform() {
this->performBehavior1(); this->performBehavior2();
}
}
所以问题的关键是:ConcreteObject 需要调用它所继承的所有类的两个函数processInfo(同名,同一个参数)。想象一下,所有的行为类都是由不同的开发人员编写的。该函数必须具有相同的名称,因为它们都派生自 BehaviorAbstract。
这样做的合理设计模式是什么?我怀疑多重继承在这里可能是错误的,也许“多重组合”会更好,但我需要所有 Behavior 类和 ConcreteObject 派生自 BehaviorAbstract 并且它们都需要在同一个受保护的BehaviorAbstract 的数据成员。
我上面写的解决方案感觉错误和丑陋。有没有办法自动调用所有实现 processInfo 的父类,而无需显式地重写它们的名称?
非常感谢您的帮助。
【问题讨论】:
-
警告在使用多重继承时使用虚拟继承(
class Behavior1: virtual public BehaviorAbstract {等)制作“钻石”,添加缺少的“;”,并将最小方法放在 protected 中比私人 -
你的代码有很多语法错误,你所有的方法都是私有的,但是一旦我修复了代码似乎没问题:wandbox.org/permlink/9fu554mXWXrPSzcV
-
谢谢,会解决问题
-
如果我错了,请纠正我,但我认为问题是关于重构
ConcreteObject类以避免使用多重继承......你试过模板吗?特征还是政策? -
另外我建议你阅读xy problem。您的问题集中在您已经意识到您不喜欢它的解决方案上,但尚不清楚您要解决的实际问题是什么
标签: c++ design-patterns multiple-inheritance