抽象工厂的多重继承
multiple inheritance for abstract factory
抽象工厂的例子是生产日本汽车,有左车门、右车门和发动机罩等。
由于我经常使用C++,所以我总是直接思考它。LeftDoor、RightDoor和Hood类,对于Model1左门,Model2左门继承LeftDoor类,RightDoor和Hood也是。如果我们想创造本田,我们只需要继承,比如本田->Model1左门,Model2右门,Model3引擎盖。那么它就完成了。
所以我的问题是我们能这样做吗?如果可以的话,为什么要使用抽象工厂?
您应该在这里使用组合而不是继承。
class Component;
class Door : public Component;
class LeftDoor : public Door;
class RightDoor : public Door;
class Car
{
vector<ComponentPtr> components;
}
class Honda : public Car
{
}
class CarFactory
{
CarPtr createCar(std::string make);
}
这是因为Honda
是一个Car
,每个Car
都有一个CD_4和RightDoor
。
工厂仅创建Car
实例。因此,如果调用CarFactor::createCar("Honda");
,它将返回Honda
的一个实例。
对于您给出的示例,我将实现Composition over Heritage,因为本田汽车与车门没有is-a关系。但不是有关系。
如果我们想创造本田,我们只需要继承,比如本田->Model1左门,Model2右门,Model3引擎盖。那么它就完成了。
你的逻辑有问题。汽车不是门。继承意味着"IS"关系。如果"A"继承了"B",则"A"是"B"的类型。另一个问题是车门和发动机罩是可选部件。若你们拆下一个车门,那个么汽车仍然是汽车,而且你们可以用不同的部件替换车门。你需要改变思维方式。在这种情况下,汽车有门,但它不是门。
多重继承的一个更合适的用法是当你有"两栖车辆"的类,并且它继承了"陆地车辆"answers"船"的情况。
至于您的"汽车模型"情况,您需要一个包含组件列表的汽车类。然后,您需要为不同的汽车模型创建不同的组件集。这些集合可以作为参数提供给"生成器"(请参见"生成器"模式),以制造您想要的汽车。
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 使用多重继承时出现编译错误
- 增强多重继承的序列化
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- C++多重继承和鸭子类型
- C++两次从文件保存对象读取多重继承
- 从多重继承中的派生类函数调用适当的父类函数
- 抽象工厂的多重继承