[C++] نمط الزوار + مبدأ فتح / مغلق


Answers

قد ترغب في التحقق من البحث عن "مشكلة التعبير"، انظر على سبيل المثال

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

وأعتقد أن المشكلة هي في معظمها أكاديمية، ولكن هذا شيء تمت دراسته كثيرا، لذلك هناك بعض الأشياء التي يمكن أن تقرأ عن طرق مختلفة لتنفيذها في اللغات الموجودة أو مع ملحقات اللغة المختلفة.

Question

هل من الممكن تنفيذ نمط الزائر الذي يحترم مبدأ فتح / إغلاق ، ولكن لا يزال قادرا على إضافة فئات جديدة قابلة للزيارة؟

وينص المبدأ المفتوح / المغلق على أن "الكيانات البرمجية (الفصول والوحدات والوظائف وما إلى ذلك) ينبغي أن تكون مفتوحة للتمديد، ولكنها مغلقة للتعديل".

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

يمكنك تنفيذ أي عدد من الفئات التي تستمد من أبستراكتفيسيتور: وهو مفتوح للتمديد. لا يمكنك إضافة فئة جديدة يمكن زيارتها كما الطبقات المستمدة من أبستراكتفيسيتور لن تجميع: أغلقت للتعديل.

تحترم شجرة فئة أرتستستراكتيس المبدأ المفتوح / المغلق. لا تحترم الشجرة الطبقية المسترجعة المبدأ المفتوح / المغلق، لأنه لا يمكن تمديده.

هل هناك أي حل آخر من أن يمدد أبستراكتفيسيور و أبستراكتفيسيبل على النحو التالي؟

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