![](/img/trans.png)
[英]calling every class that inherits a base class without knowing the class exists 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.
}
}
有沒有什么辦法來調用Visit
為item
的基類不知道它的直接基類的名字嗎? 我希望能夠在不更改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);
}
}
由於B
是A
,因此上調是隱含的 。
例如,一個真實案例可能是:
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.