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
相关产品推荐
相关产品推荐

