множественное наследование для абстрактной фабрики - PullRequest
1 голос
/ 09 марта 2012

Примером абстрактной фабрики может быть производство автомобилей японцев с левой дверью, правой дверью, капотом и т. Д.

Поскольку я часто использую C ++, я всегда думал об этом напрямую. Классы LeftDoor, RightDoor и Hood, а с левой дверью Model1, левая дверь Model2 наследует класс LeftDoor, как и RightDoor и Hood. тогда, если мы хотим создать Honda, нам просто нужно унаследовать, например, Honda -> Model1 Left door, Model2 right door, Model3 капот. тогда это сделано.

Итак, мой вопрос, можем ли мы сделать это так? если мы можем, почему мы используем абстрактную фабрику?

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Вы должны идти с композицией по наследству здесь.

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 и RightDoor.

Фабрика просто создает Car экземпляров. Поэтому, если бы вы позвонили CarFactor::createCar("Honda");, он бы возвратил экземпляр Honda.

2 голосов
/ 09 марта 2012

Для примера, который вы привели, я бы применил Composition over Inheritance, поскольку у автомобиля Honda нет отношения is-is к двери.Но вместо того, чтобы иметь отношения.

0 голосов
/ 09 марта 2012

тогда, если мы хотим создать Honda, нам просто нужно унаследовать, например, Honda -> Model1 Left door, Model2 right door, Model3 hood.тогда это сделано.

Есть проблема с вашей логикой.Автомобиль не дверь.Наследование означает отношения «есть».Если «A» наследует «B», то «A» является типом «B».Другая проблема заключается в том, что дверь и капот являются дополнительными компонентами.Если вы оторвете дверь, автомобиль останется автомобилем, плюс вы можете заменить двери другими компонентами.Вам нужно изменить способ мышления.В этом сценарии автомобиль имеет дверь, но это не дверь.

Более подходящим вариантом использования множественного наследования может быть ситуация, когда у вас есть класс для «Десантного автомобиля», и он наследует «LandVehicle» и «Лодка».,

Что касается вашей "модели автомобиля", вам нужен класс автомобиля, который содержит список компонентов.Затем вам нужно создать разные наборы компонентов для разных моделей автомобилей.Эти наборы могут быть переданы «строителю» (см. Шаблон «Строитель») в качестве аргумента, чтобы сделать автомобиль, который вы хотите.

...