首先看如下代码:
public class Parent
{
public virtual void MethodA()
{
MessageBox.Show("Parent.MethodA");
}
public virtual void MethodB()
{
MethodA();
}
}
public class Mdi:Parent
{
public override void MethodA()
{
MessageBox.Show("Mdi.MethodA");
}
}
//调用如下:
Mdi objMdi=new Mdi();
objMdi.MethodB();//此时调用方法MethodB()是调用父类Parent的MethodA()还是子类Mdi的MethodA()?
实践证明,调用的是子类Mdi中的MethodA();所以输出结果为:Mdi.MethodA
解释如下:
因为MethodA()是虚方法,大多数情况下是被派生类调用的,对于一个虚方法而言,编译器更倾向于其派生方法。
如果将类mdi改为如下:
public class Mdi:Parent
{
public new void MethodA() //将override改为new 关键字,new 关键字可以显式隐藏从基类继承的成员,此处成员为MethodA()
{
MessageBox.Show("Mdi.MethodA");
}
}
//调用如下(不变):
Mdi objMdi=new Mdi();
objMdi.MethodB();
此时输出的结果是:Parent.MethodA
说明调用的是父类的MethodA方法。
关于New关键字相关说明入下代码所示:
using System;
public class BaseC
{
public static int x = 55;
public static int y = 22;
}
public class DerivedC : BaseC
{
new public static int x = 100;
static void Main()
{
// Display the new value of x:
Console.WriteLine(x);
// Display the hidden value of x:
Console.WriteLine(BaseC.x);
// Display the unhidden member y:
Console.WriteLine(y);
}
}
输出
100
55
22
在该例中,基类 BaseC 和派生类 DerivedC 使用相同的字段名 x,从而隐藏了继承字段的值。该示例演示了 new 修饰符的用法。另外还演示了如何使用完全限定名访问基类的隐藏成员。