Search code examples
c#oopcastingvisitor-pattern

Casting to base class without knowing name of class in C#


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


Solution

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