C#派生类重写同名方法未用virtual和override仍生效的原因问询
问题解答
你遗漏的是C#中方法隐藏(方法阴影)和方法重写的差异,以及多态调用的触发条件,具体说明如下:
- 你当前代码的实际行为:没有加
virtual/override时,派生类的textmethod属于对基类同名方法的隐藏,此时编译器默认会生成警告,提示你如果是有意隐藏请添加new关键字显式声明。 - 你当前的测试场景没有触发两者的差异:你直接用
Class2类型的变量调用方法,不管是隐藏还是重写,都会优先调用和变量类型匹配的实现,所以运行结果看起来完全一致。 - 两者的核心差异体现在多态调用场景,你可以替换成以下测试代码验证区别:
public static void Main(string[] args) { // 基类类型变量指向派生类实例,这是多态的典型使用场景 Class1 obj = new Class2(); obj.textmethod(); Console.ReadKey(); }
- 无
virtual/override(方法隐藏)的运行结果:输出hello,调用基类实现 - 基类加
virtual、派生类加override(方法重写)的运行结果:输出hello there,调用派生类重写实现 - 本质差异:方法隐藏相当于派生类定义了一个和基类完全无关的同名方法,只有用派生类本身的类型变量调用才会走派生类实现;而重写是修改了方法的继承链实现,只要是指向派生类实例,不管用基类还是派生类类型的变量调用,都会走派生类的重写实现。
内容的提问来源于stack exchange,提问作者Magicco
相关产品推荐
相关产品推荐

