C#子类实例转父类后仍执行子类方法,如何实现执行父类方法?
解决C#父类引用调用方法输出父类实现的问题
这其实是C#里**方法隐藏(Method Hiding)和多态(Polymorphism)**的典型场景问题,我来给你讲清楚怎么实现你要的效果:
你提到的解决方案是完全正确的——移除Parent类Run方法的virtual关键字,同时用new修饰Child类的Run方法,就能让Parent instance = new Child();调用Run时输出"Parent running"。
具体实现代码示例
public class Parent { // 移除virtual,取消方法的多态重写支持 public void Run() { Console.WriteLine("Parent running"); } } public class Child : Parent { // 用new关键字显式隐藏父类的Run方法 public new void Run() { Console.WriteLine("Child running"); } } // 必须保留的核心语句 Parent instance = new Child(); // 转换为Parent类型后调用Run instance.Run(); // 此时输出:Parent running
为什么这样能解决问题?
- 原来的代码里,Parent的Run是
virtual、Child用override重写,这是C#的多态机制:当父类引用指向子类实例时,调用方法会优先执行子类的重写实现,所以输出"Child running"。 - 移除Parent的
virtual后,这个方法就不再允许被重写;Child里的new关键字则是显式声明要隐藏父类的同名方法——相当于子类创建了一个和父类同名但完全独立的方法,和父类的Run没有重写关系。 - 此时用Parent类型的引用调用Run时,编译器会直接绑定到Parent类的Run方法,不会去触发子类的实现,自然就输出"Parent running"了。
额外提一句:如果是用Child类型的引用调用Run,还是会执行子类的版本,这就是方法隐藏和多态重写的本质区别~
内容的提问来源于stack exchange,提问作者Joao Vitor
相关产品推荐
相关产品推荐

