Override的问题
发布网友
发布时间:2022-05-19 04:30
我来回答
共2个回答
热心网友
时间:2024-03-04 10:22
因为本人很不专业,所以不会使用什么术语。希望你能够看得明白。看不明白也不要见怪。Thanks!
产生这个问题的关键就是你在NewBase中的Show方法中使用的new关键字。事实上,因为你在这里使用了new关键字,因此在NewBase的Show方法是你在子类中定义了一个与父类中同名的方法,这个方法(Show)覆盖了父类中的方法。NewBase中的Show方法与父类中的Show方法的关系就是同名,父类Base并不能识别这个方法(这是我的理解)。现在问题就可以解释了。
1、nbbb.Show(); //显示“我来自子类的子类”
这是因为ANewBase继承了NewBase这个类,并重写了Show方法,两个类中的方法是存在重写关系的。将子类实例上转为父类对象时,父类调用的是自己可以识别的方法,当然由近及远,现在子类内部查找是否存在自己能够识别且可以调用的方法。因此,此时调用的是子类内部的Show方法。
2、bbb.Show(); //为什么这句话显示的是“我来自基类”
虽然anb继承自的NewBase继承自Base,但是因为NewBase覆盖了父类的Show方法,因此ANewBase实际上继承的是NewBase中的方法。将anb上转为Base的实例对象是,不能从内部找到Base实例可以识别并调用的方法,所以就调用父类的方法了。
你可以将NewBase中的new子去掉,使用override重写此方法试试。
热心网友
时间:2024-03-04 10:22
NewBase:Base里面:
public new virtual void Show();
这个方法使用了 new 关键字,说明这个类,声明了一个虚方面,名字叫Show,是重新定义这个方法,而不是重载这个方法.
所以,你使用 Base bbb = anb as Base;强制类型转换后,其实是进行了装箱的操作,这个时候,Base中的虚方法Show,并没有子类重载,所有显示 "我来自基类".
说的不是很明白,不过理解了
public new virtual void Show();
和
public override void Show()
之后,就没有什么问题了.