类继承方法调用异常:父类调用子类方法后Speed值未更新的修复
问题分析与修复方案
首先我得先把你没写完的代码补全(根据你的描述推测),你遇到的核心问题是C#的多态性没有正确生效,导致父类Quest()方法调用的是父类自己的数值提升方法,而不是子类重写的版本。
你原来的代码(推测版)
interface IElektroBeyin { int Speed{ get; set; } // Hız kontrolü } class AA : IElektroBeyin { public int Speed { get; set; } public void Quest() { // 想调用子类的数值提升方法,但实际调用了父类的空实现 IncreaseSpeed(); } // 父类的空实现,子类"重写"但没加override public void IncreaseSpeed() { } } class BB : AA { // 这不是重写,是隐藏父类方法 public void IncreaseSpeed() { Speed += 10; } } static void Main() { AA a = new AA(); BB b = new BB(); a.Quest(); b.Quest(); Console.WriteLine(a.Speed); // 输出0 Console.WriteLine(b.Speed); // 输出0,预期10 }
问题根源
子类BB中的IncreaseSpeed()并没有重写父类的方法,而是创建了一个全新的方法(默认隐藏父类同名方法)。当父类AA的Quest()调用IncreaseSpeed()时,它只会执行父类自己的空实现,不会触发子类的逻辑——因为没有开启多态支持。
修复方案
有两种常用的修复方式,选哪种取决于你的业务需求:
方案1:用virtual+override实现多态
把父类的数值提升方法标记为virtual,子类用override关键字明确重写这个方法,这样父类调用时会自动执行子类的实现:
interface IElektroBeyin { int Speed{ get; set; } // Hız kontrolü } class AA : IElektroBeyin { public int Speed { get; set; } public void Quest() { IncreaseSpeed(); } // 标记为virtual,允许子类重写 public virtual void IncreaseSpeed() { } } class BB : AA { // 用override重写父类的virtual方法 public override void IncreaseSpeed() { Speed += 10; } } static void Main() { AA a = new AA(); BB b = new BB(); a.Quest(); b.Quest(); Console.WriteLine(a.Speed); // 0(符合预期,父类无提升逻辑) Console.WriteLine(b.Speed); // 10(达到预期) }
方案2:抽象类+抽象方法(强制子类实现)
如果父类AA本身不需要实例化,且必须要求所有子类实现数值提升逻辑,可以把AA改成抽象类,把IncreaseSpeed()设为抽象方法:
interface IElektroBeyin { int Speed{ get; set; } // Hız kontrolü } // 父类改为抽象类,不能直接实例化 abstract class AA : IElektroBeyin { public int Speed { get; set; } public void Quest() { IncreaseSpeed(); } // 抽象方法,强制子类必须实现 public abstract void IncreaseSpeed(); } class BB : AA { public override void IncreaseSpeed() { Speed += 10; } }
额外注意点
如果你的Quest()方法是在父类的构造函数中调用的,那即使加了virtual也会有问题——因为子类对象构造时,父类构造函数先执行,此时子类的成员还未初始化,调用虚方法会执行父类的版本(如果是抽象方法则会报错)。不过从你的描述来看,是在Main里手动调用Quest(),所以不用担心这个问题。
内容的提问来源于stack exchange,提问作者PreS
相关产品推荐
相关产品推荐

