【发布时间】: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
【问题讨论】: