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

类继承方法调用异常:父类调用子类方法后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:35:46