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