我有一个Circle
班级和一个Rectangle
班级。
我现在想要创建一个类FunnyObject
,每个类由一个圆和两个矩形组成。
如果我这样做:
class FunnyObject:public Circle, public Rectangle, public Rectangle{
//How do I refer to each of the Rectangle classes?
}
如何引用Rectangle类中的函数和变量,因为存在歧义?
此外,通常构造函数是:
FunnyObject::FunnyObject:Circle(arguments), Rectangle(arguments){
//....
}
构造函数在我的情况下如何看待?
答案 0 :(得分:8)
我有一个Circle类和一个Rectangle类。我现在想制作一个类FunnyObject,每个由一个圆和两个矩形组成。
使用对象组合而不是继承。
class FunnyObject
{
Circle circle;
Rectangle rectangle1;
Rectangle rectangle2;
}
答案 1 :(得分:7)
帮助继承的一个简单方法是考虑" 是" vs." 有一个"。
如果您有" 是"关系,你使用继承。如果您有" 有"你创建了一个新的数据成员。
FunnyObject是一个矩形和一个圆?如果是,继承。
FunnyObject 有两个矩形和圆圈吗?如果是,请创建成员变量。
答案 2 :(得分:5)
在这种情况下,您不需要继承,请使用composition:
class FunnyObject
{
Circle myCircle;
Rectangle myRectangle1;
Rectangle myRectangle2;
}
答案 3 :(得分:1)
正如你所说:
我有一个Circle类和一个Rectangle类。我现在想做一个 类FunnyObject,每个由一个圆和两个矩形组成。
“...每个由一个圆圈和两个矩形组成。”解决方案是您自己问题的措辞。正如@ scoohe01所说,一个技巧是在FunnyObject 是一个 Circle和两个Rectangle之间做出选择,或者FunnyObject 由一个Circle和两个Rectangle组成。在您的情况下,并按照您选择的措辞,您的设计应符合后一种选择。
另一个诀窍是你不能多次继承。在您的示例中,您希望从Rectangle继承两次。假设有getSide1()
方法。你会怎么称呼它? getSide1'1()
和getSide1'2()
......没有办法。
这也令人困惑。如果您从 Circle 和 Rectangle 继承,您最终会使用getRadius()
,getSide1()
等方法进行混合(因此得名)和getSide2()
。它似乎同时具有半径和边,这没有任何意义。
最后,有子类规则或Liskov的替换原则。 继承类( FunnyObject ?)是否可以在使用Circle或Rectangle的所有情况下使用?一点也不。好吧,至少以一种有意义的方式。
希望这有帮助。