我有一个C ++类来描述3D空间中对象的方向 - 位置,旋转,缩放等。我有其他类需要这样的信息(或其中的一部分) - 模型,地形,相机现在我可以制作我的方向类的子类,但谷歌告诉我更喜欢组合而不是继承。这在哲学上是有道理的 - 模型 不是一个方向,它有一个(是的,我知道is-a has-a thing只是一个启发式)。然而,对于所有那些可能的子类重写相同的包装器方法似乎是不必要的,几乎完全不太优雅,只需要获得该功能。像model.getOrientation().set_x(1)
这样的事情似乎也很愚蠢。
我可以看到为什么这对于小物体来说不会“太糟糕”,但是对于这个例子(以及其他类似的),如果你不得不通过箍来假装你正在使用继承吗?我现在应该使用它吗?我几乎可以肯定我正在考虑这个问题。
答案 0 :(得分:6)
看起来很愚蠢,但你的model.getOrientation().set_x(1)
可能就好了。
如果您厌倦了输入getOrientation()
部分,可以尝试这样的事情:
Orientation & orient = model.getOrientation();
orient.set_x(1);
orient.set_y(1);
if( orient.check_something() ) {
//whatever
}
//etc.
答案 1 :(得分:5)
有一种廉价的方法可以避免大部分包装样板。
class model : private orientation {
public:
using orientation::set_x;
... etc ...
};
C ++中的私有继承(不一定)意味着“是一个”。它对外人来说或多或少是不可见的,有时被描述为“以”来实现“。也就是说,您获得了一种有限形式的合成,有助于您展示组合对象的部分或全部接口。
答案 2 :(得分:3)
为具有方向的事物写一个类。让模型,地形,相机等继承该类。如果要进行任何包装,则只需要在一个类中进行。使用getter可以更改方向存储在对象中的方式。