Заявление о гигантском переключении для конструкторов - PullRequest
5 голосов
/ 16 июля 2011

У меня есть контейнер, который содержит несколько указателей на базовый класс, и функция, которая принимает некоторые входные данные и возвращает класс, который является подклассом базового класса. Какой подкласс он возвращает, зависит от ввода.

Прямо сейчас у меня есть гигантское заявление о переключении, подобное этому:

class Base { ... }

class A : public Base { ... }
class B : public Base { ... }
...
class Z : public Base { ... }

Base* depends(int input) {
    switch (input) {
    case 1:
        return new A(...);
    case 2:
        return new B(...);
    ...
    case 26:
        return new Z(...);
    default:
        ...
    }
}

Мне было интересно, есть ли лучший способ создать это. Я не знаю многих «шаблонов проектирования» (думаю, так они называются), поэтому я не знаю, есть ли (очевидный) лучший способ создать это.

Ответы [ 4 ]

6 голосов
/ 16 июля 2011

То, что вы ищете, это шаблон фабричного метода .

Здесь важно исключить необходимость в базовом классе иметь какие-либо знания о реализациях производного класса. Для базового класса плохой дизайн иметь знания о производных классах.

Шаблон Factory Method решает вышеуказанную проблему, поскольку создание происходит вне базового класса.

1 голос
/ 16 июля 2011

Целочисленный параметр "вход" происходит откуда-то.Возможно, вы сможете позволить коду, который создал этот int, создать реальный объект.Это не сработает, если вы читаете int с диска или что-то в этом роде.

Вы можете подумать о создании ситуации, когда разные подклассы регистрируются в объекте, который их создает.В этом случае объекту фабрики не нужно знать о подклассах во время компиляции.Это можно сделать во время запуска, используя глобальные переменные, конструкторы которых регистрируются для каждого подкласса.Ваше заявление о переключении проще и быстрее, но оно означает, что вы должны поддерживать переключение в актуальном состоянии при изменении подклассов.Это компромисс, и я не думаю, что ваше решение обязательно уступает более сложному.

1 голос
/ 16 июля 2011

Другой способ - создать массив, в который вы будете помещать указатели на функции, которые будут вызывать соответствующий конструктор.А в зависимости от вашего () вы будете вызывать только те функции, которые вам нужны при заданном вводе.Но так или иначе вам нужно 26 функций в этом подходе

1 голос
/ 16 июля 2011

Это немного сложно понять, что вы собираетесь с этим, но вы можете рассмотреть шаблон Abstract Factory, если вы хотите создать группу различных подклассов на основе некоторого входного параметра.

...