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