c++ 处理不同的继承变量集的设计模式?

vxqlmq5t  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个基类,它存储了数据库记录的所有列。我希望有三个子类,它们使用Run()方法将该记录的不同字段发送到不同的接收方。
但是,子类继承了未使用的变量(在本例中是数据库记录的字段)的问题。
我只想在基类中使用公共字段,并将其他字段存储在子类中。
那么如何使用基类指针设置子类的成员变量呢?
Child1Child2Child3类都不使用所有字段(field1field2、...)。如果将每个子类想要的字段转移到自己的类中,那么我该如何使用来自父类的SetFields来设置不同子类中的不同字段?

class Interface
{
public:
    int field1, field2, field3, ..., fieldN;
    void SetFields(field1,field2,field3,fieldN); // --\> gets all the fields as arguments
    virtual void Run() = 0;
};

class Child1 : public Interface
{
public:
    void Run() {
    /// send field1, field2, field3 to recepient1
    }
};

class Child2: public Interface
{
public:
    void Run() {
    /// send field4, field5, field6 to recepient2
    }
};

class Child3: public Interface
{
public:
    void Run() {
    /// send field7, field8, fieldN to recepient3
    }
};

字符串
我需要一个设计模式,可以发送使用父类的子成员。

sxissh06

sxissh061#

要求

我只想在基类中使用公共字段,而将其他字段存储在子类中。
1.类必须存储公共字段。->建议的类名为Common,而不是Interface
类Child 1、Child 2、Child 3都不使用所有字段(field 1、field 2、...)。
1.其他类存储不常用的字段。->建议的类名为Additional<n>,而不是Child<n>
我希望有三个子类,它们使用Run()方法将该记录的不同字段发送给不同的接收者。
1.附加类(Additional<n>)发送专用字段。

设计

如果我正确地理解了需求,那么我看不出需要继承、接口类、基类等。
我建议改用聚合。

C++程式码

class Common
{
public:
    int mnField1;
    int mnField2;
    ...
    AdditionalA madditionalA;
    AdditionalB madditionalB;
    ...
    void SetFields(int nFieldC1, int nFieldC2, int nFieldA1, int nFieldB1) {
        mnField1 = nFieldC1;
        mnField2 = nFieldC2;
        ...
        madditionalA.mnField1 = nFieldA1;
        madditionalB.mnField1 = nFieldB1;
        ...
    }
    void Run() {
        // send mnField1, mnField2 ...
        madditionalA.Run();
        madditionalB.Run();
    }
};

class AdditionalA
{
public:
    int mnField1;
    ...
    void Run() {
        // send mnField1
    }
};

class AdditionalB
{
public:
    int mnField1;
    ...
    void Run() {
        // send mnField1
    }
};

...

字符串

提示

  • “包含”-> * 聚合 *
  • 例如,一条记录 * 包含 * 个字段。
  • “是”-> * 派生 *
  • 汇票是一种单据。
  • “相关”-> * 关联 *
  • 例如:客户 * 地址 * 项目。

相关问题