在 C# 中不知道 class 的名称的情况下转换为基础 class

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

我一直在用 C# 实现访问者模式。我拥有的是:

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

Visitor class:

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

混凝土Visitorclass:

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.
  }
}

有没有办法在不知道其直接基 class 名称的情况下为 item 的基 class 调用 Visit?我希望能够在不更改 ConcreteVisitor class.

的情况下更改层次结构

谢谢

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:你的设计可能有点奇怪,但我被你的问题挑战了;)

我真的相信有一个更简单的解决方案,它涉及更改访问者的方法标识符:

public class ConcreteVisitor : Visitor {
  public override void VisitB(B item) {
    VisitA(item);
  }
}

由于 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;
     }
}