继承是设计建筑商/工厂的好工具吗?
Is inheritance a good tool to design a builder/factory
我有几个复杂的类,它们是使用从要创建的类继承的单独创建者类构造的。
一个例子可能是从无序数据构造的图形。
class Graph{
//....
public:
void showData();
protected:
std::vector<std::pair<int,int> > mConnectedData;
}
class GraphCreator:private Graph{
public:
//...
void construct();
private:
std::map<double,int> mSomeHelperContainer;
//...
}
对于构造,我需要许多辅助函数和辅助数据,我将其放在另一个类 GraphCreator 中。由于许多与图相关的函数也是必要的,并且由于我在任何情况下都需要图的数据,因此我使用私有继承。由于这绝不是著名的is-a关系,并且由于私人继承通常被认为是糟糕设计的暗示,我有一些怀疑:这是一个好主意和设计工厂的一种适当方法,还是有一些我没有考虑过的主要缺点?设计这样一个工厂的更好方法是什么?
编辑:
感谢您到目前为止的回答!一些附加信息,使当前使用的方法的原因更加清晰。我不能使用静态创建方法(Creator 中的状态变量太多),我有另一个约束:我想在库中向其他人提供独立于创建者的图形(例如与从文件读取方法一起)。那些不应该关心创作者。因此,我也有点不确定朋友的用法,因为它在 Graph 类中添加了代码。
这不是
一个好方法(从任何有数据的东西继承很少是)。
传统方法是:
- 让
GraphCreator
成为Graph
friend
- 在
Graph
中将该方法实现为static
Build
方法(直接)
决定主要取决于是否需要"工厂"是有状态的。class
用于表示方法无法执行的状态。
- 因此,如果您需要状态,则需要
class
来存储它,因此GraphCreator
是您最好的选择。 - 对于无状态方法,
static
方法要轻得多。
如果您犹豫不决,请选择最简单的(static
方法),看看它能走多远:)
我从这里采用的经验法则是
尽可能使用组合,必要时使用私有继承。
"你必须"的一个具体例子是,当你从中继承的类有一些虚拟或纯虚函数时,你必须实现这些函数才能使用你的私有基础:如果不继承,你就无法做到这一点。
从你的描述来看,使用继承是不可避免的;因此,我认为最好使用组合。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在clang++预处理器中确定gcc工具链版本
- 使用Unique_ptr确保工厂中的对象唯一
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 带有继承的C++工厂
- 参数化自定义CMake工具链
- 如何在QT中的自定义视频小工具t上绘制矩形
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 用于C++的静态二进制检测或二进制重写工具和框架
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- Q没有管理权限的 exe 无法启动维护工具
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- C++合并排序可视化工具
- 为Bazel工具链指定sysroot
- 在自动工具中包含用于不同bin_Programs的不同库
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- 继承是设计建筑商/工厂的好工具吗?