首页 > 解决方案 > 多态调用转到基类而不是子类

问题描述

在调用 C 类型的对象时MethodX,我期望MethodY()B 中的调用(用问号突出显示)最终调用 C's MethodY。但是调试会话显示它正在调用 A's MethodY()

我很困惑为什么。B 中的断点MethodX()清楚地表明this是 C 类型的对象。我已经尝试this.MethodY();以及删除虚拟/覆盖并使用新的,结果相同。我是否对另一种语言感到困惑或忽略了什么?

public abstract class A {
  protected virtual void MethodY() {...}   // This one's being called.
}

public class B : A {
  protected override void MethodY() {...}

  public override void MethodX() {
     MethodY();   // ???
  }
}

public class C : B {
  protected override void MethodY() {...}   // But want this one to be called

  protected override void MethodX() {
    base.MethodX();
    ...
  }
}

标签: c#polymorphism

解决方案


我期待MethodY()电话B最终会打电话CMethodY

它确实

public abstract class A
{
    public virtual void MethodX()
      => Console.WriteLine("A - X");

    public virtual void MethodY()
      => Console.WriteLine("A - Y");
}

public class B : A
{
    public override void MethodY()
      => Console.WriteLine("B - Y");

    public override void MethodX()
    {
        Console.WriteLine("B - X");
        MethodY();
    }
}

public class C : B
{
    public override void MethodY()
      => Console.WriteLine("C - Y");

    public override void MethodX()
    {
        Console.WriteLine("C - X");
        base.MethodX();
    }
}

public static void Main()
{
    var c = new C();
    c.MethodX();
}

输出

C - X
B - X
C - Y

完整的演示在这里


推荐阅读