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

WinForms中子类对象调用父类ExecuteOpp方法而非自身方法的问题

问题解决方案:子类方法调用不符合预期的问题

问题根源

你用new关键字在子类Enumer中定义的ExecuteOpp方法,只是隐藏了父类Operation的同名方法,并没有真正实现多态重写。当父类类型的变量(Operation)引用子类实例时,CLR会优先调用父类的方法——因为new不会修改父类方法的虚方法表,只有virtual+override组合才能让父类变量调用子类的实现。

解决方案

步骤1:将父类方法标记为虚方法

在父类Operation中,把ExecuteOpp方法标记为virtual,允许子类重写:

public class Operation
{
    // 标记为virtual,开启多态支持
    public virtual void ExecuteOpp()
    {
        // 父类原有逻辑
    }
}

步骤2:子类用override替代new重写方法

子类Enumer中,把new关键字换成override,实现真正的方法重写:

public class Enumer : Operation
{
    // 用override重写父类的virtual方法
    public override void ExecuteOpp()
    {
        // 子类自定义逻辑
    }
}

步骤3:验证工厂模式调用效果

现在不管是直接创建子类实例,还是通过字典工厂返回Operation类型变量,调用ExecuteOpp都会执行子类的逻辑:

// 字典工厂示例
Dictionary<string, Type> operationFactory = new Dictionary<string, Type>()
{
    {"Enumer", typeof(Enumer)}
};

// 动态创建实例并赋值给Operation类型变量
Operation op = (Operation)Activator.CreateInstance(operationFactory["Enumer"]);
op.ExecuteOpp(); // 此时会执行Enumer类的ExecuteOpp方法

补充说明

  • new关键字仅用于隐藏父类方法,只有当变量是子类类型时,才会调用子类的隐藏方法;
  • virtual+override是C#实现多态的标准方式,父类类型变量引用子类实例时,会自动匹配并调用子类的重写方法;
  • 调试时显示对象是Enumer实例但方法走父类,本质是因为没有开启多态,CLR根据变量的编译时类型(Operation)选择了父类方法。

内容的提问来源于stack exchange,提问作者CUatKSU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:22:22