在 C++ 中继承相同的 class 两次(故意)
Inherit same class twice in C++ (on purpose)
我有一个 Circle
class 和一个 Rectangle
class。
我现在想做一个classFunnyObject
,每个由一个圆和两个长方形组成。
如果我这样做:
class FunnyObject:public Circle, public Rectangle, public Rectangle{
//How do I refer to each of the Rectangle classes?
}
由于存在歧义,如何在两个 Rectangle classes 中引用函数和变量?
还有,一般构造函数是:
FunnyObject::FunnyObject:Circle(arguments), Rectangle(arguments){
//....
}
在我的案例中,构造函数看起来如何?
I have a Circle class and a Rectangle class. I now want to make a class FunnyObject, each made of one circle and two rectangles.
使用对象组合而不是继承。
class FunnyObject
{
Circle circle;
Rectangle rectangle1;
Rectangle rectangle2;
}
帮助继承的一个简单技巧是考虑“是一个”与“有一个”。
如果你有一个“是一个”的关系,你使用继承。如果你有一个“有一个”关系,你创建一个新的数据成员。
FunnyObject 是一个矩形还是一个圆?如果是,继承。
FunnyObject 有两个矩形和圆形吗?如果是,则创建成员变量。
在这种情况下你不需要继承,使用组合:
class FunnyObject
{
Circle myCircle;
Rectangle myRectangle1;
Rectangle myRectangle2;
}
如你所说:
I have a Circle class and a Rectangle class. I now want to make a
class FunnyObject, each made of one circle and two rectangles.
“...每个 由 一个圆和两个矩形组成。”解决方案就在你自己问题的措辞中。正如@scoohe01 所说,一个技巧是在 FunnyObject 是一个 圆和两个矩形之间进行选择,或者 FunnyObject 是由 一个圆和两个矩形组成。在你的情况下,按照你选择的措辞,你的设计应该与后一种选择相对应。
另一个技巧是你不能继承超过一次。在您的示例中,您希望从 Rectangle 继承两次。假设有一个 getSide1()
方法。你会如何称呼它? getSide1'1()
和 getSide1'2()
... 没有办法。
也是一头雾水。如果您从 Circle 和 Rectangle 继承,您将最终得到混合方法(因此得名),如 getRadius()
, getSide1()
和 getSide2()
。它似乎既有半径又有边,这没有意义。
最后,还有 subclassing 规则或 Liskov 替换原则。
继承class (FunnyObject?) 是否可以在所有使用Circle 或Rectangle 的情况下使用?一点也不。好吧,至少以一种有意义的方式。
希望对您有所帮助。
我有一个 Circle
class 和一个 Rectangle
class。
我现在想做一个classFunnyObject
,每个由一个圆和两个长方形组成。
如果我这样做:
class FunnyObject:public Circle, public Rectangle, public Rectangle{
//How do I refer to each of the Rectangle classes?
}
由于存在歧义,如何在两个 Rectangle classes 中引用函数和变量?
还有,一般构造函数是:
FunnyObject::FunnyObject:Circle(arguments), Rectangle(arguments){
//....
}
在我的案例中,构造函数看起来如何?
I have a Circle class and a Rectangle class. I now want to make a class FunnyObject, each made of one circle and two rectangles.
使用对象组合而不是继承。
class FunnyObject
{
Circle circle;
Rectangle rectangle1;
Rectangle rectangle2;
}
帮助继承的一个简单技巧是考虑“是一个”与“有一个”。
如果你有一个“是一个”的关系,你使用继承。如果你有一个“有一个”关系,你创建一个新的数据成员。
FunnyObject 是一个矩形还是一个圆?如果是,继承。
FunnyObject 有两个矩形和圆形吗?如果是,则创建成员变量。
在这种情况下你不需要继承,使用组合:
class FunnyObject
{
Circle myCircle;
Rectangle myRectangle1;
Rectangle myRectangle2;
}
如你所说:
I have a Circle class and a Rectangle class. I now want to make a class FunnyObject, each made of one circle and two rectangles.
“...每个 由 一个圆和两个矩形组成。”解决方案就在你自己问题的措辞中。正如@scoohe01 所说,一个技巧是在 FunnyObject 是一个 圆和两个矩形之间进行选择,或者 FunnyObject 是由 一个圆和两个矩形组成。在你的情况下,按照你选择的措辞,你的设计应该与后一种选择相对应。
另一个技巧是你不能继承超过一次。在您的示例中,您希望从 Rectangle 继承两次。假设有一个 getSide1()
方法。你会如何称呼它? getSide1'1()
和 getSide1'2()
... 没有办法。
也是一头雾水。如果您从 Circle 和 Rectangle 继承,您将最终得到混合方法(因此得名),如 getRadius()
, getSide1()
和 getSide2()
。它似乎既有半径又有边,这没有意义。
最后,还有 subclassing 规则或 Liskov 替换原则。 继承class (FunnyObject?) 是否可以在所有使用Circle 或Rectangle 的情况下使用?一点也不。好吧,至少以一种有意义的方式。
希望对您有所帮助。