在C++物理模拟中,我有一个名为Circle和Square的类.这些是形状,并有一个名为push()的方法,它对它施加力.然后是Circle的一个特例,称之为SpecialCircle,其中push()应该表现出略微不同的属性.但事实上,还有SpecialSquare()应该具有相同的力属性.所以我想要一个名为Shape的抽象基类来处理Circles和Squares,但是我还想要一个名为Special的抽象基类,它将特殊属性应用于force().
设计这种类结构的最佳方法是什么?
到目前为止,我有:
class Shape { virtual void push(); }; class Circle : public Shape {}; class Square : public Shape {}; class Special { virtual void push(); }; class SpecialCircle : public Circle, Special {}; class SpecialSquare : public Square, Special {};
当然,上面不会编译,因为Special :: push()和Shape :: push()冲突.正如预期的那样,我得到"错误:请求成员'推送'是模棱两可的".
如何重新组织我的类结构,以便Circle和Square可以相互共享某些属性,但是SpecialCircle和SpecialSquare仍然可以继承Shape,还可以继承Special的修改功能?
谢谢.
ps.,这是钻石继承问题吗?
另一种解决方案(它可能适合您的需求,也可能不适合您的需求,具体取决于您的实施细节):
拥有类Behavior,让NormalBehavior和SpecialBehavior继承它.
让类成为Shape,让Square和Circle继承它.让Shape成为聚合类型,使用Behavior成员(即将Behavior对象传递给各种Shape构造函数).换句话说,让一个Shape有一个行为.
将形状行为的实际差异委托给行为层次结构的方法.
相反,您可以:
拥有PhysicalObject类,让NormalObject和SpecialObject继承它;
让班级变形,让Square和Circle继承它;
让PhysicalObject具有Shape.
更喜欢继承聚合.这是Bridge模式的应用.这个策略相对于Square,SpecialSquare,Circle和SpecialCircle的优势在于明天你必须添加Rectangle,Hexagon等等,对于你添加的每个形状,你必须实现两个类(重复)代码是邪恶的); 在我看来,这是Bridge解决的真正问题.