1

我有一个A看起来像这样的类:

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

我想A在另一个类中使用B。我不想B成为 的子类型A,但我希望A的公共方法能够以某种形式被B的用户访问。

实现此目的的一种方法是简单地将 的实例包含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(); }
}

我想知道是否有一种“首选”方式来做到这一点(甚至可能不涉及上述两种选择),或者这只是一个偏好问题。谢谢。

4

2 回答 2

6

还有一种方法是:

class B : private A
{
public:
    using A::someMethod;
    using A::anotherMethod;
};
于 2012-06-20T18:31:47.063 回答
2

我想知道是否有一种“首选”方式来做到这一点(甚至可能不涉及上述两种选择),或者这只是一个偏好问题。谢谢。

恐怕这真的取决于细节。

当继承没有意义时,您更喜欢组合而不是继承是正确的。A你如何实现它取决于公开一个实例是否有意义。

是否存在A您不想更改的状态,或您不希望公开的功能?您是否希望在调用其中一个函数时执行任何预处理或后处理A?您是否关心用户是否将您的实例设置A为另一个?您可能会这样做(尽管您可以只创建一个 getter 函数),因此在这种情况下更喜欢包装函数。

A完全公开是否更有意义?如果是这样,您可以通过不编写一堆样板代码来节省时间。

这实际上归结为您的包装类的语义。

于 2012-06-20T18:35:41.397 回答