Sé qué es el Patrón de visitante y cómo usarlo; esta pregunta no es un duplicado de este one.C++: dudas sobre el patrón de visitante
Tengo una biblioteca donde pongo la mayor parte del código reutilizable que escribo y que me enlace a la mayoría de mis proyectos.
A menudo necesito agregar funciones a algunas clases, pero sin agregar estas nuevas características a la biblioteca. Permítanme utilizar un ejemplo real:
En este lib Tengo una clase Shape
, heredado por CircleShape
, PolygonShape
y CompositeShape
.
Ahora estoy desarrollando una aplicación gráfica donde tengo que hacer que estos Shape
, pero no quiero poner una función virtual en la clase render
Shape
núcleo, ya que algunos de mis proyectos que utilizan Shape
no hacen ningún el renderizado y otros proyectos gráficos podrían usar diferentes motores de renderizado (estoy usando Qt para este proyecto, pero para un juego usaría OpenGL, así la función render
necesitará diferentes implementaciones).
La forma más famoso de hacerlo es utilizando el patrón del visitante, por supuesto, pero esto hace estallar unas pocas dudas en mi mente:
Cualquier clase de cualquier biblioteca podría ser necesario extender como mi Shape
hace. La mayoría de las bibliotecas públicas (sobre todas ellas) no brindan ningún soporte para Patrón de visitante; ¿por qué? ¿por qué debería?
Visitor Pattern es una forma de simular Double Dispatching en C++. No es nativo en C++, y requiere una implementación explícita, lo que hace que la interfaz de clase sea más compleja: no creo que la función applyVisitor
esté en el mismo nivel que las funciones de mi clase, veo esto como romper la abstracción.
Explicitly up-casting Shape
con dynamic_cast
es más caro, pero a mí me parece una solución más limpia.
Entonces, ¿qué debo hacer? ¿Implementando Double Dispatching en todas mis clases de biblioteca? ¿Qué sucede si la biblioteca que proporciona Shape
no es mía, pero se encuentra alguna biblioteca de GPL en Internet?
El patrón de visitante no es una forma de obtener múltiples de despacho. Necesita despacho múltiple y, por lo tanto, una técnica para emular el despacho múltiple generalmente se enseña a los programadores de C++ como parte del patrón de visitante. – AProgrammer
¿Necesita despacho múltiple? Quizás el patrón de NVI satisface sus necesidades. Parece que un diseño de NVI podría ayudar pero requiere un procesamiento no virtual y métodos de tipo doRender virtual privado. Entonces, tal vez una clase abstracta entre forma y círculo de formas llamada shaperenderengine. ShapeCircle podría entonces derivar de forma o de shaperenderengine ..... – Eric