假设我们有两个类,A
并且B
.当使用组合来建模"has-a"或"is-implemented-in-terms-of"关系(例如B
has-a A
)时,缺点与继承之一是B
不包含A
它需要的公共功能.为了获得对A
公共函数的访问,有必要提供转发函数(与继承相反,B
继承所有A
的公共函数).
为了给出一个更具体的例子,假设我们有一个Person
它具有-A ContactInfo
:
using namespace std;
class ContactInfo
{
public:
ContactInfo();
void updateAddress(string address);
void updatePhone(string phone);
void updateEmail(string email);
private:
string address;
string phone;
string email;
};
class Person
{
public:
Person();
// Forwarding functions:
void updateAddress(string address){contactInfo.updateAddress(address)};
void updatePhone(string phone){contactInfo.updatePhone(phone)};
void updateEmail(string email){contactInfo.updateEmail(email)};
private:
ContactInfo contactInfo;
};
Run Code Online (Sandbox Code Playgroud)
在设计中忽略任何不足之处(这只是一个人为的例子来证明我下面的问题),我不得不不厌其烦地从复制确切函数签名ContactInfo
中Person
.在一个更复杂的例子中,可能有许多这样的函数,以及许多组合类的层,导致许多代码重复,具有所有常见的维护和容易出错的问题等. …