I've been implementing visitor pattern in C#. What I have is:
Hierarchy of classes:
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);
}
}
The Visitor
class:
public abstract class Visitor {
public virtual void Visit(A item) {
//...
}
public virtual void Visit(B item) {
Visit(item as A);
}
}
Concrete Visitor
class:
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.
}
}
Is there any way to call Visit
for item
's base class without knowing its direct base class name? I would like to be able to change hierarchy without changing ConcreteVisitor
class.
Thank you
Make it the responsibility of A
. With a method for example:
public class A {
public virtual void Accept(Visitor visitor)
{
visitor.Visit(this);
}
public A AsBase()
{
return this;
}
}
and
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: your design is maybe a bit odd, but I was challenged by your question ;)