可以将方法添加到对象中吗?

时间:2017-12-08 01:16:45

标签: c++

所以我们有一个班级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有任何虚拟方法或数据成员,那么这不会起作用。但是,如果它只是我希望在对象上提供的一组方法呢?是否有更好的替代方案来实现此功能?

2 个答案:

答案 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);
}