【问题标题】:Virtual inheritance to generalise code among two different abstract child classes虚拟继承以在两个不同的抽象子类之间泛化代码
【发布时间】:2023-01-08 02:40:22
【问题描述】:

我有一个界面,它在某种意义上是行为的,它提供了一些可以应用于特定数据形状的功能。例如,分层数据结构。

首先,让我们定义基类

class Base {

    virtual void general_functionality() = 0;
    virtual void general_functionality1() = 0;
};

然后,我有另一个继承自 Base 的抽象类,但它还添加了一些特定的接口,例如动态分层数据结构(例如,可以通过将其同步到数据库来更改数据)

   class CommonBaseForDynamicApp : public Base {

    virtual void apply_dynamic_logic() = 0;
};

现在让我们看看我们有一个基于 Json 的数据结构的第一个实现。 (留下实现代码)

class CommonBaseForJsonDynamicAppImpl1 : public CommonBaseForDynamicApp {

    void apply_dynamic_logic() override {};
    void general_functionality() override {};
    void general_functionality1() override {};
};

我们可以有另一个类似 Yaml 的

class CommonBaseForYamlDynamicAppImpl1 : public CommonBaseForDynamicApp {

    void apply_dynamic_logic() override {};
    void general_functionality() override {};
    void general_functionality1() override {};
};

现在我们还想支持基于 Json 的数据结构,其中底层数据不会是例如外部连接到例如数据库。因此,我现在再次直接继承Base

class CommonBaseForJsonStaticApp : public Base {

    void general_functionality() override {};// Same impl as CommonBaseForJsonDynamicAppImpl1::general_functionality;
    void general_functionality1() override {};// Same impl as CommonBaseForJsonDynamicAppImpl1::general_functionality1;
};

从上面可以看出,由于代码重复,设计有点问题。许多静态和动态应用程序重叠。

我想到的第一个解决方案是利用虚拟继承。这里,我们实现了一个直接继承自Base的类

class CommonForJson : public Base {
    void general_functionality() override {};
    void general_functionality1() override {};
};

然后,我们的静态案例可以直接继承自它(在这种情况下它不必这样做,因为不需要额外的代码)。

class CommonBaseForJsonStaticApp : public CommonForJson {

};

对于动态情况,我们必须从两个地方继承,即使用虚拟继承。 :

class CommonBaseForJsonDynamicAppImpl : public CommonBaseForDynamicApp, virtual CommonForJson {
    void apply_dynamic_logic() override {};
};

虽然上面的方法可行,但我怀疑这种类型的继承和紧密耦合从长远来看可能会产生问题。所以我想问问上面的问题是否有更理想的替代设计模式 - 我假设其他人也可能遇到过这个问题。 我们正在使用 c++-20

【问题讨论】:

    标签: c++ c++20 virtual


    【解决方案1】:

    与 CommonBaseForJsonDynamicAppImpl1::general_functionality 相同的实现

    如果是这样,那么您的类层次结构中的核心假设就是错误的。也就是说,CommonBaseForDynamicApp之所以使用Base作为基类,是因为这两个功能是相互作用的。您可以用相同的方式实现它们的事实证明它们不属于同一类层次结构。

    在我看来,无论CommonBaseForDynamicApp 代表什么,它都不是一定需要来自Base 的东西。因此,它不应该在同一个类层次结构中。也许这是某些类型的东西而不是某些类型的东西.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2011-11-17
      • 2023-04-03
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多