11

我有一个 C++ 类,它描述了对象在 3D 空间中的方向 - 位置、旋转、比例等。我还有其他类需要类似的信息(或其子集) - 模型、地形、相机等。现在我可以创建我的方向类的那些子类,但谷歌告诉我更喜欢组合而不是继承。这在哲学上是有道理的——模型不是一个方向,它一个(是的,我知道 is-a has-a 只是一种启发式)。然而,为所有那些可能的子类重写相同的包装方法似乎是不必要的,几乎是可笑的不雅,只是去获得那个功能。类似的事情model.getOrientation().set_x(1)看起来也很愚蠢。

我可以明白为什么这对于小对象来说不会“太糟糕”,但是对于这个例子(以及其他类似的例子),如果你必须通过箍来假装你正在使用继承,那么组合的意义何在?我现在应该使用它吗?我几乎可以肯定我正在不正确地考虑这个问题。

4

3 回答 3

9

有一种便宜的方法可以避免大多数包装样板。

class model : private orientation {
  public:
    using orientation::set_x;
    ... etc ...
};

C++ 中的私有继承并不(必然)意味着“是”。它对外界来说或多或少是不可见的,有时被描述为“以 a 的形式实现”的意思。也就是说,您获得了一种有限的组合形式,这有助于您公开组合对象的部分或全部接口。

于 2013-06-07T22:33:19.163 回答
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.
于 2013-06-07T19:47:52.833 回答
3

为有方向的事物编写一个类。让模型、地形、相机等从该类继承。如果你想做任何包装,你只需要在一个班级里做。使用 getter 以便您可以更改方向存储在对象中的方式。

于 2013-06-07T19:43:31.437 回答