如何巧妙,多态地用许多不同的成员类型填充对象?

时间:2018-07-09 14:16:03

标签: c++ oop design-patterns polymorphism

是否存在一种面向对象模式来用大量数据填充对象,而这些数据在每个对象内通常都是多态的? [编辑]这里的问题是,在代码的另一部分中,我将有一个指向基类的指针,并且我想填充此基类所指向的具体对象的数据。

  • 我的第一个想法是使用纯虚方法创建基类。因此,每个具体对象将实现如何填充其数据。但是,随着代码的发展,我注意到基类的增长太大了,以至于无法存储数十个纯抽象方法,而具体类则覆盖了许多不必要的方法,这些方法仅对其同级有用。

示例:

public Filler
{
     virtual void fill_struct1(struct myStruct1) = 0;
     virtual void fill_struct2(struct myStruct2) = 0;
     // I will need more methods to give the derivate objects the capacity of
     // filling its data members polymorphically.
}

class A: public Filler
{
     void fill_struct1(struct myStruct1);
     void fill_struct2(struct myStruct2);
     // There can be more overwritten methods.
     struct myStruct1 member_1;
     struct myStruct2 member_2;
     struct myStruct3 member_3;
     // There can be more members of different types.
}

class B: public Filler
{
     void fill_struct1(struct myStruct1);
     void fill_struct2(struct myStruct2);
     void fill_struct4(struct myStruct4);
     // There can be more overwritten methods.
     struct myStruct1 member_1;
     struct myStruct2 member_2;
     struct myStruct4 member_3;
     // There can be more members of different types. But sometimes the members can be equal one used in a sibling.
}

2 个答案:

答案 0 :(得分:1)

一种克服冗余的方法是使用模板方法:

template<class T>
void fill_struct1(T& obj)
{
  obj.member_1 = ...;
}

可以在具有member_1(类型为myStruct1的任何对象)上调用此方法。如果您所有的fill_struct1方法都做完全相同的事情,那么可能值得研究。

答案 1 :(得分:1)

尝试在此处分离问题:

  • 设置A或相关类的实例应在构造函数中完成。如果要传递给构造函数的参数太多,则将它们分组在结构中。
  • 如果设置不同的实例需要类似的代码段,请将其放入免费函数中
  • 如果设置这些实例的逻辑非常复杂,请注意builder pattern。这涉及到不同层次结构中的类,这与您当前的方法所建议的相反。
  • 基类和派生类可以具有不同的成员变量,可以将它们尽可能地分开。仅在必要时通过基类中受保护的成员变量在派生类之间共享状态。

另一个问题与第一点很正交: