문제

구현할 수 있습니까? 방문자 패턴 존중 오픈/폐쇄 원리, 그러나 여전히 새로운 방문 가능한 수업을 추가 할 수 있습니까?

개방형/폐쇄 원칙은 "소프트웨어 엔티티 (클래스, 모듈, 기능 등)는 확장을 위해 열려 있어야하지만 수정을 위해 닫아야한다"고 명시하고 있습니다.

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에서 파생 된 클래스를 구현할 수 있습니다. 확장을 위해 열려 있습니다. AbstractVisitor에서 파생 된 클래스가 컴파일되지 않으므로 새로운 방문 가능한 클래스를 추가 할 수 없습니다. 수정을 위해 닫혔습니다.

AbstractVisitor 클래스 트리는 개방/폐쇄 원칙을 존중합니다. 초록 Visitable 클래스 트리는 확장 할 수 없기 때문에 개방/폐쇄 원칙을 존중하지 않습니다.

아래와 같이 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 ++에서 acyclic 방문자 (PDF)는 당신이 원하는 것을 얻습니다.

다른 팁

"표현 문제"에 대한 연구를 확인하고 싶을 수도 있습니다.

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

나는 문제가 대부분 학문적이라고 생각하지만, 그것은 많이 연구 된 것이므로 기존 언어 나 다양한 언어 확장으로 구현할 수있는 다양한 방법에 대해 읽을 수있는 약간의 내용이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top