You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:54:05