ура

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

У меня есть библиотека, куда я помещаю большую часть кода, который я могу повторно использовать, и на который я ссылаюсь в большинстве своих проектов.

Часто мне нужно добавлять функции в некоторые классы, но без добавления этих новых функций в библиотеку. Позвольте мне привести реальный пример:

В этой библиотеке у меня есть классShapeнаследуетсяCircleShape, PolygonShape а такжеCompositeShape.

Я сейчас разрабатываю графическое приложение, где мне нужно отрендеритьShape, но не хочу ставить виртуальную функциюrender в ядреShape класс, так как некоторые из моих проектов, которые используютShape не делайте рендеринга, и другие графические проекты могут использовать разные механизмы рендеринга (я использую Qt для этого проекта, но для игры я бы использовал OpenGL, поэтомуrender функция потребует разных реализаций).

Конечно, самый известный способ сделать это - использовать Visitor Pattern, но это вызывает у меня несколько сомнений:

Любой класс любой библиотеки может быть расширен как мойShape делает. Большинство публичных библиотек (почти все) не предоставляют никакой поддержки Шаблон посетителя; Зачем? почему я должен?

Шаблон посетителя - это способ симуляции двойной диспетчеризации в C ++. Он не является родным в C ++ и требует явной реализации, что делает интерфейс класса более сложным: я не думаю, чтоapplyVisitor Функция должна быть на том же уровне, что и функции моего класса, я вижу это как нарушение абстракции.

Явно повышающий рейтингShape сdynamic_cast дороже, но для меня это выглядит как более чистое решение.

И что же мне делать? Реализация двойной диспетчеризации во всех моих библиотечных классах? Что делать, если библиотека предоставляетShape не моя, но какая-то библиотека GPL найдена в интернете?

Ответы на вопрос(5)

Ваш ответ на вопрос