簡體   English   中英

在不知道C#中的類名的情況下轉換為基類

[英]Casting to base class without knowing name of class in 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.
  }
}

有沒有什么辦法來調用Visititem的基類不知道它的直接基類的名字嗎? 我希望能夠在不更改ConcreteVisitor類的情況下更改層次結構。

謝謝

讓它成為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;
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM