C ++组合 - 我必须包装所有这些函数吗?

时间:2013-06-07 19:40:06

标签: c++ oop inheritance composition

我有一个C ++类来描述3D空间中对象的方向 - 位置,旋转,缩放等。我有其他类需要这样的信息(或其中的一部分) - 模型,地形,相机现在我可以制作我的方向类的子类,但谷歌告诉我更喜欢组合而不是继承。这在哲学上是有道理的 - 模型 不是一个方向,它一个(是的,我知道is-a has-a thing只是一个启发式)。然而,对于所有那些可能的子类重写相同的包装器方法似乎是不必要的,几乎完全不太优雅,只需要获得该功能。像model.getOrientation().set_x(1)这样的事情似乎也很愚蠢。

我可以看到为什么这对于小物体来说不会“太糟糕”,但是对于这个例子(以及其他类似的),如果你不得不通过箍来假装你正在使用继承吗?我现在应该使用它吗?我几乎可以肯定我正在考虑这个问题。

3 个答案:

答案 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可以更改方向存储在对象中的方式。