Я знаю, какой шаблон посетителя и как его использовать; этот вопрос не является дубликатом этого one.C++: сомнения относительно шаблона посетителя
У меня есть библиотека, где я положил большую часть повторно используемого кода я пишу, и который я ссылку на большинство моих проектов.
Часто мне нужно добавить функции в некоторые классы, но без добавления этих новых функций в библиотеку. Позвольте мне использовать реальный пример:
В этих библиотеках я получил класс Shape
, унаследованный CircleShape
, PolygonShape
и CompositeShape
.
Я сейчас разрабатываю графическое приложение, где мне нужно, чтобы сделать эти Shape
, но не хочу, чтобы поставить виртуальную функцию render
в классе ядра Shape
, так как некоторые из моих проектов, которые используют Shape
не делать какой-либо рендеринг и другие графические проекты могут использовать разные механизмы рендеринга (я использую Qt для этого проекта, но для игры я бы использовал OpenGL, поэтому функции render
понадобятся разные реализации).
Самый известный способ сделать это с помощью Visitor Pattern, конечно, но это выскакивает некоторые сомнения в мой ум:
Любой класс любой библиотеки может понадобиться, чтобы быть продлен, как мой Shape
делает. Большинство публичных библиотек (обо всех них) не предоставляют никакой поддержки шаблону посетителя; Зачем? почему я должен?
Шаблон посетителей - это способ имитации Double Dispatching в C++. Он не является родным на C++ и требует явного внедрения, что делает интерфейс класса более сложным: я не думаю, что функция applyVisitor
должна быть на том же уровне функций моего класса, я вижу это как нарушение абстракции.
Явное повышение литья Shape
с dynamic_cast
дороже, но для меня это выглядит как более чистое решение.
Итак, что мне делать? Реализация Double Dispatching во всех моих библиотечных классах? Что делать, если библиотека, предоставляющая Shape
, не была моей, но некоторая библиотека GPL найдена в Интернете?
Паттерн посетитель не способ получить множественную диспетчеризацию. Это требует многократной отправки, и поэтому метод эмулирования множественной отправки обычно преподается программистам на С ++ как часть шаблона посетителя. – AProgrammer
Вам нужно несколько отправки? Возможно, образец NVI соответствует вашим потребностям. Похоже, что дизайн NVI может помочь, но для этого требуются не виртуальные визуальные и частные методы типа doRender. Так что, возможно, абстрактный класс между формой и шейпингом называется shaperenderengine. ShapeCircle может затем выводиться из формы или из shaperenderengine ..... – Eric