在 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);
}
}
混凝土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.
}
}
有没有办法在不知道其直接基 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);
}
}
由于 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;
}
}
我一直在用 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);
}
}
混凝土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.
}
}
有没有办法在不知道其直接基 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);
}
}
由于 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;
}
}