| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Паттерн стратегия - скрыть одну из реализаций |
| Автор: Tiarwe 17.9.2014, 23:39 | ||||||||||||||
| Добрый день! Есть такой вот интерфейс:
От него наследуются реализации:
Идея следующая: DecoderA был создан изначально программистом и его реализация скрыта от глаз (.h недоступен), DecoderB - добавлен в дальнейшем в процессе работы (.h доступен). Этим всем делом заведует некий Decoder:
Соответственно, используется это дело так:
Теперь мне нужно скрыть реализацию DecoderA с глаз:
Соответственно, при компиляции сыпятся ошибки, что для DecoderA не найден конструктор. Делаем специализацию, которую помещаем в .cpp (откуда будет виден DecoderA.h и виден конструктор этого класса):
Снова ошибки при компиляции. Изменяем код следующим образом:
Теперь реализация DecoderA работает, но инициализировать Decoder другими реализациями интерфейса нельзя, т.к. функции Initialize() определена лишь для спецификации DecoderA... Как, а главное можно-ли, заставить шаблон работать со всеми реализациями интерфейса, включая те, что скрыты от глаз разработчика (например DecoderA)? |
| Автор: baldina 18.9.2014, 10:48 |
| явно инстанцируйте шаблон в .cpp http://ideone.com/3edSvg |
| Автор: Tiarwe 18.9.2014, 15:07 | ||||||
Объясняю) Есть интерфейс для, например, рендера графики. Его реализации используют всякие OpenGL и DirectX функции. Если их засунуть в сорцы, затем собрать статическую библиотеку, то в дальнейшем, когда создаём какой-то новый проект и хотим рисовать графику, нет нужны таскать с собой хедеры DX, OpenGL и писать по 20 раз к ним пути. Достаточно просто прилинковать библиотеку и выбрать реализацию. Сейчас всё так и работает, но нет возможности указывать с какой именно реализацией мы хотим работать - она выбирается через перечисление, передаваемое в Initialize(). А если мне хочется использовать какую-то ещё новую реализацию, то приходится перегружать эту функцию и передавать в неё указатель. Добавлено через 13 минут и 35 секунд
Думал, не подходит. Допустим, у нас есть класс A, в котором есть Decoder. Его реализация может выбираться в зависимости от платформы. |
| Автор: math64 19.9.2014, 08:05 |
| Тогда нужно писать плагин. реализация класса в плагине, интерфейс в заголовке, используемом в основной программе и плагине. |