【发布时间】:2015-12-06 18:08:23
【问题描述】:
当我有一个防止派生类覆盖基类中定义的虚拟方法的方法时,我与虚拟继承的规则非常混淆。这里有一些代码可以更好地解释我的问题:
using System;
namespace ConsoleApplication1
{
public class A
{
public virtual void DoWork()
{
Console.WriteLine("A.DoWork()");
}
}
public class B : A
{
public override void DoWork()
{
Console.WriteLine("B.DoWork()");
}
}
public class C : B
{
public sealed override void DoWork()
{
Console.WriteLine("C.DoWork()");
}
}
public class D : C
{
public new void DoWork()
{
Console.WriteLine("D.DoWork()");
}
}
public class MyMainClass
{
public static void Main()
{
B b = new D();
b.DoWork();
C c = new D();
c.DoWork();
A a = new D();
a.DoWork();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
输出
C.DoWork()
C.DoWork()
C.DoWork()
按任意键退出
确实,如果使用 B 类型的变量来访问 C 的实例为B b = new C();
b.DoWork() 将导致调用 C 的 DoWork() 实现,因为 C 覆盖了 A 的虚拟 DoWork()。
但是为什么当使用C、B或A类型的变量来访问D的实例时是这样的
B b = new D();
C c = new D();
A a = new D();
对它们中的每一个调用 DoWork() 都会调用 C 类上的 DoWork() 实现?
【问题讨论】:
-
@PrestonGuillot 可能不会 - 看起来 OP 根本不理解
virtual并且问题恰好提到了sealed/new。 -
我投票决定将此问题作为离题结束,因为 OP 正试图与设计的语言相反
标签: c# polymorphism overriding sealed