solid principios principio cerrado abierto c++ design-patterns oop visitors

c++ - principios - Patrón de visitante+Principio abierto/cerrado



principio abierto cerrado java (2)

¿Es posible implementar el patrón de visitante respetando el principio abierto / cerrado , pero aún así ser capaz de agregar nuevas clases visitables?

El principio abierto / cerrado establece que "las entidades de software (clases, módulos, funciones, etc.) deben estar abiertas para la extensión, pero cerradas para su modificación".

struct ConcreteVisitable1; struct ConcreteVisitable2; struct AbstractVisitor { virtual void visit(ConcreteVisitable1& concrete1) = 0; virtual void visit(ConcreteVisitable2& concrete2) = 0; }; struct AbstractVisitable { virtual void accept(AbstractVisitor& visitor) = 0; }; struct ConcreteVisitable1 : AbstractVisitable { virtual void accept(AbstractVisitor& visitor) { visitor.visit(*this); } }; struct ConcreteVisitable2 : AbstractVisitable { virtual void accept(AbstractVisitor& visitor) { visitor.visit(*this); } };

Puede implementar cualquier cantidad de clases que se deriven de AbstractVisitor: está abierto para extensión. No puede agregar una nueva clase visitable ya que las clases derivadas de AbstractVisitor no se compilarán: se cerró para su modificación.

El árbol de clase AbstractVisitor respeta el principio abierto / cerrado. El árbol de clases AbstractVisitable no respeta el Principio Abierto / Cerrado, ya que no se puede extender.

¿Hay alguna otra solución que extender el AbstractVisitor y el AbstractVisitable como se muestra a continuación?

struct ConcreteVisitable3; struct AbstractVisitor2 : AbstractVisitor { virtual void visit(ConcreteVisitable3& concrete3) = 0; }; struct AbstractVisitable2 : AbstractVisitable { virtual void accept(AbstractVisitor2& visitor) = 0; }; struct ConcreteVisitable3 : AbstractVisitable2 { virtual void accept(AbstractVisitor2& visitor) { visitor.visit(*this); } };



Es posible que desee consultar la investigación sobre "el problema de expresión", ver, por ejemplo

http://lambda-the-ultimate.org/node/2232

Creo que el problema es principalmente académico, pero es algo que se ha estudiado mucho, por lo que hay algunas cosas que puedes leer sobre las diferentes formas de implementarlo en los idiomas existentes o con varias extensiones de idioma.