所以我们有一个班级Customer
。我没有别的选择,只能使用Customer
代表我拥有的任何客户,包括我写的任何方法的签名等。但我的数据略有不同;我仍然需要Customer
中的大部分功能,但是我需要根据我的特殊情况对某些字段进行分类。例如:
class Customer
{
public:
string GetName();
void SetName(string _name);
string GetAge();
void SetAge(string _age);
protected:
string name;
string age;
};
class SpecialCustomer : public Customer
{
public:
string GetAddress();
void SetAddress(string _address);
}
所以这一切看起来都很简单,但我遇到的问题是我被迫绕过Customer
。但幸运的是,在我的特殊情况下,我根本不需要age
!所以我需要做的是重新使用age
数据成员来保存我的地址。是的,我知道这很糟糕。不,我无法更改要求 - 我的特殊数据已以适合Customer
对象。
为了做到这一点,我当然可以从SpecialCustomer
构建一个Customer
,但我想避免复制。 (编辑:此外,许多数据成员直接公开,所以我不能使用组合并支持他们的使用)相反,我考虑使SpecialCustomer
成为一个包装器,暴露我想要的功能。问题是Customer
的真正实现并非无足轻重 - 重新实现整个界面需要做一些工作,减去我不想要的字段。
实现这一目标的唯一方法就是这样:
void foo (Customer & _c)
{
SpecialCustomer & sc = reinterpret_cast<SpecialCustomer &>(_c);
}
显然,如果SpecialCustomer
有任何虚拟方法或数据成员,那么这不会起作用。但是,如果它只是我希望在对象上提供的一组方法呢?是否有更好的替代方案来实现此功能?
答案 0 :(得分:1)
似乎你的双手与使用OO技术绑在一起。如何使用格式
的普通旧非成员函数<script defer src="https://use.fontawesome.com/releases/v5.0.1/js/all.js"></script>
您仍然存在确定客户是否特殊的问题
答案 1 :(得分:0)
应该这样做,使用构图而不是继承。
class SpecialCustomer {
public:
SpecialCustomer(Customer&) : _customer(customer) {}
string getAge() { return customer.GetAge(); }
private:
Customer& _customer;
}
此时不需要施法。而是实例化包装类就足够了。
用法:
void foo (Customer & _c)
{
SpecialCustomer sc(_c);
}