c# - 多态调用转到基类而不是子类
问题描述
在调用 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();
...
}
}
解决方案
我期待
MethodY()
电话B
最终会打电话C
给MethodY
它确实
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
推荐阅读
- mysql - MYSQL - 尽管使用 ORDER BY id,但使用 LIMIT 和 GROUP BY 时的非确定性顺序
- node.js - 从模拟器上的 Firebase 存储流式传输文件时 Firebase 功能超时
- mainframe - 在 JCL 中对 JOB 和 EXEC 使用 COND
- python - 如果脚本未正确运行,似乎无法将错误写入输出文件
- reactjs - 反应弹簧动作僵硬,好像没有质量或摩擦
- javascript - 如何在新页面中显示 JS/Html 调查的结果?
- excel - Excel - 月平均
- r - 向数据框添加平均值
- python - 如何在 plotly express 中更改散点矩阵中的轴限制?
- python - Python/Selenium:“无法访问此站点”导致“未知错误:无法确定加载状态”