This question already has answers here:
C# - Keyword usage virtual+override vs. new
(10 个回答)
5年前关闭。
当我有一个方法可以防止派生类覆盖基类中定义的虚方法时,与虚继承的规则非常混淆。这里有一些代码可以更好地解释我的问题:
输出
C.DoWork()
C.DoWork()
C.DoWork()
按任何一个键退出
确实,如果使用类型 B 的变量作为
但是为什么当 C、B 或 A 类型的变量用于访问 D 的实例时
对它们中的每一个调用 DoWork() 将调用 C 类上的 DoWork() 实现?
(10 个回答)
5年前关闭。
当我有一个方法可以防止派生类覆盖基类中定义的虚方法时,与虚继承的规则非常混淆。这里有一些代码可以更好地解释我的问题:
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 的变量作为
B b = new C();
访问 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() 实现?
最佳答案
D
类现在有两个方法,称为 DoWork
。
第一个(方法#1)是在 A
类中定义并在 C
类中覆盖的虚方法。 D
从 C
继承了这个方法。
第二个(方法#2)是在类 D
本身中定义的非虚拟方法。这种方法与方法#1 完全不同。
现在,您无法从 D
类型的变量访问方法 #1,因为方法 #2 hides 方法 #1。
但是,您仍然可以通过使用 A
、 B
或 C
类型的变量来访问方法#1。
为了更清楚地说明这一点,这里有一个例子:
D var_d = new D();
B var_b = var_d;
var_d.DoWork(); //This accesses method #2 on an object of type D
var_b.DoWork(); //This accesses method #1 on the same object
关于c# - C#中的虚拟继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34120818/
10-10 10:58