我正在尝试在 C++ 中找到一个很好的继承解决方案。
我有一个矩形类和一个正方形类。 Square 类不能公开继承 Rectangle,因为它不能完全满足矩形的要求。例如,矩形可以单独设置其宽度和高度,这对于正方形来说当然是不可能的。
所以,我的困境。 Square 显然会与 Rectangle 共享很多代码;它们非常相似。
例如,如果我有一个类似的函数:
bool IsPointInRectangle(const Rectangle& rect);
它也应该适用于正方形。事实上,我有很多这样的功能。
因此,在创建我的 Square 类时,我想我将使用私有继承和可公开访问的 Rectangle 转换运算符。所以我的方形类看起来像:
class Square : private Rectangle
{
public:
operator const Rectangle&() const;
};
然而,当我尝试将 Square 传递给 IsPointInRectangle 函数时,我的编译器只是抱怨在该上下文中“矩形是不可访问的基数”。我希望它能注意到矩形运算符并使用它。
我想做的事情可能吗?
如果这行不通,我可能会将 Rectangle 的一部分重构为可变矩形 http://en.wikipedia.org/wiki/Circle-ellipse_problem#Factor_out_modifiers class.
Thanks.
你可以上一堂课ImmutableRectangle
,没有任何突变并且只有const
方法,从中您可以正确导出两者Rectangle
,并且分别,ImmutableSquare
并且,由此,Square
。请注意,除去可变性,IS-A
关系doeshold——一个不可变的正方形 IS-A 不可变的矩形:可变性是唯一严重的问题,因此通过将其分解出来,您可以获得一些实质性的代码重用(对于所有const
使用——实际上不使用或不需要可变性的那些)。
只要(不可变)基实际上没有类不变量,沿继承引入可变性就可以了rely关于不变性特征;当然,一个不可变的对象可以正确地从const
指向可变版本的指针或引用(大概在单独的内联友元函数中,以避免基类对派生类的依赖;-)以便合理方便地使用。
Edit:一条评论可以理解地表达了疑虑,因为“mutabe 不是一成不变的”:要推理这一点,你需要理解什么是“IS-A”means...确实如此not意思是科尔日布斯基 http://en.wikipedia.org/wiki/Alfred_Korzybski-否认”is
身份”:这意味着LSP http://en.wikipedia.org/wiki/Liskov_substitution_principle。仔细检查约束条件,这意味着:协变、逆变、较弱相等的前提条件、较强相等的后置条件等,因为它们适用于const methods基类(不可变)和派生类(可变)。正如我在上一段中提到的,您会发现类不变量是唯一的问题,因此只要避免将不变性断言为类不变量,您就陷入了三叶草;-)。
也许命名基类会有所帮助NotNecessarilyMutableRectangle
因为它没有assert作为类不变量的不变性;这种非常精确的命名可能在哲学上令人放心,但在日常编码中可能有点不方便。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)