Domanda

È possibile implementare Pattern visitatori rispettando Principio aperto / chiuso , ma puoi ancora aggiungere nuove classi visitabili?

Il principio aperto / chiuso afferma che le entità software (classi, moduli, funzioni, ecc.) dovrebbero essere aperte per l'estensione, ma chiuse per modifica ".

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);
   }
};

È possibile implementare qualsiasi numero di classi che deriva da AbstractVisitor: è aperto per l'estensione. Non è possibile aggiungere una nuova classe visitabile poiché le classi derivate da AbstractVisitor non verranno compilate: è stata chiusa per modifica.

L'albero della classe AbstractVisitor rispetta il principio aperto / chiuso. L'albero di classe AbstractVisitable non rispetta il principio aperto / chiuso, in quanto non può essere esteso.

Esiste altra soluzione che estendere AbstractVisitor e AbstractVisitable come di seguito?

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);
   }
};
È stato utile?

Soluzione

In C ++, Visitatore aciclico (pdf) ottiene tu quello che vuoi.

Altri suggerimenti

Potresti voler dare un'occhiata alla ricerca su " il problema dell'espressione " ;, vedi ad esempio

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

Penso che il problema sia principalmente accademico, ma è qualcosa che è stato studiato molto, quindi ci sono un po 'di cose che puoi leggere su diversi modi per implementarlo in lingue esistenti o con varie estensioni di lingua.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top