当子类与父类拥有完全一样的方法时,称子类“隐藏”了父类的同名方法。
如果子类中某个方法与父类方法完全一样(即方法名和方法参数都一样),假设父类变量引用一个子类对象,那么通过父类变量访问此方法,访问到的是子类还是父类所定义到的方法?
Public class Parent{
Public void HideF(){
Console.WriteLine(“Parent.HideF()”);
}
}
Public class Child:Parent{
Public void HideF(){
Console.WriteLine(“Child.HideF()”);
}
}
// 输出
Parent par = new Child();
par.HideF(); // Parent.HideF()
当分别位于父类和子类的两个方法完全一样时,调用哪个方法由对象变量的编译时类型决定。
如果确实希望调用的是子类的方法,应先进行强制类型转换
((Child)par).HideF();
回过头来再看看parent和Child类,vs在编译这两个类是会发出一个警告:
警告1: “HideExamples.Child.HideF()” 隐藏了继承的成员
“HideExamples.Child.HideF()”如果是有意隐藏,请使用关键字new
当然上述警告并不影响程序运行结果,却告诉我们代码不符合C#的语法规范,修改Child类的代码以消除上述警告:
Public class Child:Parent{
Public new void HideF(){
Console.WriteLine(“Child.HideF()”);
}
}
New关键字明确告诉C#编辑器:子类会隐藏父类的同名方法,并提供自己的新版本。
由于子类隐藏了父类的同名方法,所以如果要在子类方法的实现代码中调用父类被隐藏的同名方法,请使用base关键字,示例代码如下:
Public class Child:Parent{
Public new void HideF(){
Console.WriteLine(“Child.HideF()”);
base.HideF(); // 调用父类被隐藏的方法
}
}