방문자 패턴 + 개방/폐쇄 원리
-
05-07-2019 - |
문제
구현할 수 있습니까? 방문자 패턴 존중 오픈/폐쇄 원리, 그러나 여전히 새로운 방문 가능한 수업을 추가 할 수 있습니까?
개방형/폐쇄 원칙은 "소프트웨어 엔티티 (클래스, 모듈, 기능 등)는 확장을 위해 열려 있어야하지만 수정을 위해 닫아야한다"고 명시하고 있습니다.
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
나는 문제가 대부분 학문적이라고 생각하지만, 그것은 많이 연구 된 것이므로 기존 언어 나 다양한 언어 확장으로 구현할 수있는 다양한 방법에 대해 읽을 수있는 약간의 내용이 있습니다.
제휴하지 않습니다 StackOverflow