c#两层继承隐藏覆盖方法
本文关键字:继承 隐藏 覆盖 方法 两层 | 更新日期: 2023-09-27 18:19:06
请告诉我为什么下面代码的结果是BaseClass::method
?我认为DerivedClass2将只是覆盖被声明为new的DerivedClass1的虚拟方法,这意味着不使用BaseClass方法。或者,由于DerivedClass2覆盖了DerivedClass1的虚拟方法,因此存在动态绑定,它将调用DerivedClass2方法版本,而不是调用DerivedClass1或BaseClass的方法版本。任何帮助吗?我的推理有什么问题?由于
class BaseClass
{
public void method() { Console.WriteLine("BaseClass::method"); }
}
class DerivedClass1 : BaseClass
{
public new virtual void method() { Console.WriteLine("DerivedClass1::method"); }
}
class DerivedClass2 : DerivedClass1
{
public override void method(){ Console.WriteLine("DerivedClass2::method"); }
}
class Program
{
static void Main(string[] args)
{
BaseClass e = new DerivedClass2();
e.method();//BaseClass::method. But Why???
Console.ReadLine();
}
}
您正在调用BaseClass
的非virtual
方法。
无论派生类是否添加其他方法,该方法都将被调用。
BaseClass.method()
不是虚拟的。在DerivedClass1
中通过虚拟方法隐藏,然后在DerivedClass2
中覆盖。
变量e
的类型是BaseClass
,这是编译器用来查找要调用的方法的类型。唯一的选择是非虚拟的BaseClass.method()
。如果将变量的类型更改为DerivedClass1
,编译器将解析对virtual new DerivedClass1.method()
的调用。在运行时,DerivedClass2.method()
将被调用。
使用new
修饰符隐藏方法时,不要期望有多态行为
因为在这一行中:
BaseClass e = new DerivedClass2();
e
的行为类似于BaseClass
对象。所以它调用BaseClass.method
。
就像你写的:
DerivedClass2 e = new DerivedClass2();
((BaseClass)e).method();
你必须多读一些,了解继承和多态性