我有一个 C++ 类,它描述了对象在 3D 空间中的方向 - 位置、旋转、比例等。我还有其他类必须需要类似信息(或其子集)的信息 - 模型、地形、相机等等。现在我可以创建我的方向类的那些子类,但是谷歌告诉我更喜欢组合而不是继承。这在哲学上是有道理的——一个模型不是不是一个方向,它有一个(是的,我知道是-一个有-一个东西只是一种启发式)。然而,为所有那些可能的子类重写相同的包装方法似乎是不必要的,几乎滑稽地不优雅,只是去获得那个功能。 model.getOrientation().set_x(1)
之类的东西看起来也很愚蠢。
我明白为什么这对于小物体来说不会“太糟糕”,但是对于这个例子(以及其他类似的例子),如果你无论如何都必须通过箍来假装你在使用继承?我现在应该使用它吗?我几乎可以肯定我在不恰本地考虑这个问题。
最佳答案
有一种廉价的方法可以避免大部分包装样板文件。
class model : private orientation {
public:
using orientation::set_x;
... etc ...
};
C++ 中的私有(private)继承并不(必然)意味着"is"。它对局外人来说或多或少是不可见的,有时被描述为“以某种方式实现”的意思。也就是说,您获得了一种有限的组合形式,这有助于让您能够公开组合对象的部分或全部接口(interface)。
关于C++ 组合——我必须包装所有这些函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991785/