سؤال

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

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

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

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

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

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

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);
   }
};
هل كانت مفيدة؟

المحلول

في C ++، حلقية الزوار (قوات الدفاع الشعبي) يحصل لك ما تريد.

نصائح أخرى

وأنت قد ترغب في التحقق من البحوث حول "المشكلة التعبير"، انظر منها مثلا.

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top