抽象工厂的多重继承

时间:2012-03-08 20:03:16

标签: c++ design-patterns multiple-inheritance

抽象工厂的例子是生产日本汽车,有左门,右门和胡德等。

由于我经常使用C ++,所以我总是直接考虑它。 LeftDoor,RightDoor和Hood类,以及Model1左门,Model2左门继承LeftDoor类,RightDoor和Hood也是如此。那么如果我们想创造本田,我们只需要继承,比如本田 - > Model1左门,Model2右门,Model3引擎盖。然后就完成了。

所以我的问题是我们能这样做吗?如果我们可以,为什么我们使用抽象工厂?

3 个答案:

答案 0 :(得分:3)

你应该在这里使用构图而不是继承。

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 都有 LeftDoor和{{ 1}}。

工厂只创建RightDoor个实例。因此,如果您调用Car,它将返回CarFactor::createCar("Honda");的实例。

答案 1 :(得分:2)

对于您给出的示例,我将实施Composition over Inheritance,因为本田汽车与门没有is-a关系。但不是有关系。

答案 2 :(得分:0)

  

那么如果我们想要创造本田,我们只需要继承,比如本田 - &gt; Model1左门,Model2右门,Model3引擎盖。然后就完成了。

您的逻辑存在问题。汽车不是门。继承意味着“IS”关系。如果“A”继承“B”,则“A”类型“B”。另一个问题是门和罩是可选部件。如果你扯掉一扇门,汽车仍然是汽车,另外你可以用不同的部件更换车门。你需要改变思维方式。在这种情况下,汽车有一扇门,但它不是一扇门。

当你拥有“两栖车辆”的类并且它继承了“LandVehicle”和“Boat”时,更适合使用多重继承。

至于您的“汽车模型”情况,您需要一个包含组件列表的汽车类。然后,您需要为不同的汽车模型创建不同的组件集。这些集合可以作为参数提供给“构建者”(参见“构建器”模式),以便制作您想要的汽车。