我有一个类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(); }
}
我想知道是否存在这样做的“首选”方式(或者甚至可能不涉及上述两种替代方案的方式),或者仅仅是偏好问题。感谢。
答案 0 :(得分:6)
另一种方法是:
class B : private A
{
public:
using A::someMethod;
using A::anotherMethod;
};
答案 1 :(得分:2)
我想知道是否存在这样做的“首选”方式(或者甚至可能不涉及上述两种替代方案的方式),或者仅仅是偏好问题。感谢。
这真的归结为我恐怕的具体细节。
当继承没有意义时,你更喜欢组合优于继承。如何实现这取决于是否有必要使A
的实例公开。
A
中是否存在您不想更改的状态,或者您不希望公开的功能?当您调用A
函数之一时,您是否希望执行任何前期或后期处理?您是否关注用户是否将A
的实例设置为另一个?你可能会这样做(虽然你可以只做一个getter函数),所以在这种情况下更喜欢包装函数。
A
完全公开会更有意义吗?如果是这样,你就不用写一堆样板代码来节省时间。
这真的归结为你的包装类的语义。