对象组合与提供显式包装器

时间:2012-06-20 18:29:58

标签: c++ oop

我有一个类A,如下所示:

class A {
// A's internal state
public:
  void someMethod();
  void anotherMethod();
};

我想在另一个班级A中使用B。我不希望B成为A的子类型,但我希望A的公共方法可以以某种形式访问B的用户。< / p>

实现此目的的一种方法是简单地将A的实例包含为B的公共成员:

class B {
public:
  A a;
  // other members
};

另一个是让A成为B的私有成员,并围绕A的公共方法提供包装:

class B {
  A a;
public:
  void someMethod(){ a.someMethod(); }
  void anotherMethod(){ a.anotherMethod(); }
}

我想知道是否存在这样做的“首选”方式(或者甚至可能不涉及上述两种替代方案的方式),或者仅仅是偏好问题。感谢。

2 个答案:

答案 0 :(得分:6)

另一种方法是:

class B : private A
{
public:
    using A::someMethod;
    using A::anotherMethod;
};

答案 1 :(得分:2)

  

我想知道是否存在这样做的“首选”方式(或者甚至可能不涉及上述两种替代方案的方式),或者仅仅是偏好问题。感谢。

这真的归结为我恐怕的具体细节。

当继承没有意义时,你更喜欢组合优于继承。如何实现这取决于是否有必要使A的实例公开。

A中是否存在您不想更改的状态,或者您不希望公开的功能?当您调用A函数之一时,您是否希望执行任何前期或后期处理?您是否关注用户是否将A的实例设置为另一个?你可能会这样做(虽然你可以只做一个getter函数),所以在这种情况下更喜欢包装函数。

A完全公开会更有意义吗?如果是这样,你就不用写一堆样板代码来节省时间。

这真的归结为你的包装类的语义。