2017-04-02 3 views
3

저는 C#에서 방문자 패턴을 구현했습니다. 내가 가지고있는 것은 : 클래스의C#에서 클래스 이름을 모른 채 기본 클래스로 캐스팅

계층 :

public class A { 
    public virtual void Accept(Visitor visitor) 
    { 
    visitor.Visit(this); 
    } 
} 

public class B : A { 
    public override void Accept(Visitor visitor) 
    { 
    visitor.Visit(this); 
    } 
} 

Visitor 클래스 :

public abstract class Visitor { 
    public virtual void Visit(A item) { 
    //... 
    } 
    public virtual void Visit(B item) { 
    Visit(item as A); 
    } 
} 

콘크리트 Visitor 클래스 :

public class ConcreteVisitor : Visitor { 
    public override void Visit(B item) { 
    // do something 
    // and call Visit for base class 
    Visit(item as A); // I need to know type A. 
    } 
} 

에 대한 Visit를 호출 할 수있는 방법이 있나요 item의 기본 클래스가 d를 모른 채로 있습니다. irect 기본 클래스 이름? ConcreteVisitor 클래스를 변경하지 않고 계층 구조를 변경할 수 있기를 바랍니다.

+0

왜 당신은 심지어 유일한 것은 않는 경우''이 무효 방문 (B 항목) 않습니다됩니다 호출'무효 방문 (A 항목)' –

+0

base.Visit (item)를 호출하면되지만, 디자인에 뭔가 다른 것이 있다는 신호 일 수 있다는 사실이 필요합니다. –

+0

@AdrianoRepetti 기본 방문에서 방문을 호출하고 싶지 않지만 방문 항목 (항목 .AsBaseClass())과 같은 항목의 기본 클래스를 방문하십시오 – tomwesolowski

답변

3

그것을 A의 책임을 확인 감사드립니다.

public class A { 
    public virtual void Accept(Visitor visitor) 
    { 
    visitor.Visit(this); 
    } 
    public A AsBase() 
    { 
    return this; 
    } 
} 

public class ConcreteVisitor : Visitor { 
    public override void Visit(B item) { 
    // do something 
    // and call Visit for base class 
    Visit(item.AsBase()); // convert to base type 
    } 
} 

PS : 예를 들어, 방법으로 당신의 디자인은 어쩌면 조금 이상한,하지만 난 당신의 질문에 의해 도전되었다)

0

내가 정말이 있다고 생각 방문자의 메서드 식별자를 변경하는 간단한 솔루션 :

BA이고, 업 캐스트는 입니다.입니다.

예를 들어, 실제 사례는 다음과 같을 수 있습니다

public abstract class CarVisitor 
{ 
    public virtual Engine VisitEngine(Engine engine) => engine; 

    public virtual DieselEngine VisitDieselEngine(DieselEngine engine) => engine; 
} 

public sealed class MyCarVisitor : CarVisitor 
{ 
    public override DieselEngine VisitDieselEngine(DieselEngine engine) 
    { 
      VisitEngine(engine); 

      return engine; 
    } 
} 
관련 문제