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

如何从两层或多层派生类中调用被重写的基类方法?

问题:多层派生类中调用被重写的上层基类方法

我希望从2层或3层派生类中调用被重写的基类函数,示例代码如下:

public class Level1
{
    public virtual void Encrypt(byte[] plain)
    {
        Console.WriteLine("level1");
    }
}

public class Level2: Level1
{
    public override void Encrypt(byte[] plain)
    {
        Console.WriteLine("level2");
        Console.WriteLine("Calling base class");
        base.Encrypt(plain);
    }
}

public class Level3: Level2
{
    public override void Encrypt(byte[] plain)
    {
        Console.WriteLine("Level3");
        // 调用Level2的Encrypt
        base.Encrypt(plain);
        // 如何调用Level1的Encrypt?
        base.base.Encrypt(plain);
    }
}

以下写法会出现语法错误:

base.base.Encrypt(plain)
CryptECB.Encrypt(plain)

请问如何从两层或多层派生类中调用被重写的函数?目前我通过在Level2中定义L1Encrypt并在Level3中调用作为临时解决方案,但这种方式较为繁琐,因为可能需要针对不同层级的多个函数做类似处理。


可行解决方案

方法1:显式转换为上层基类调用

将当前实例强制转换为目标基类(比如Level1),直接调用其方法,这样会绕过中间派生类的重写逻辑:

public class Level3: Level2
{
    public override void Encrypt(byte[] plain)
    {
        Console.WriteLine("Level3");
        base.Encrypt(plain);
        // 调用Level1的Encrypt实现
        ((Level1)this).Encrypt(plain);
    }
}

这种方式简单直接,无需修改中间类的代码,适合只需要偶尔跨层级调用的场景。

方法2:在中间基类封装转发方法

如果需要频繁跨层级调用,可以在中间派生类(比如Level2)中封装专门的方法,用来调用上层基类的实现,供下层类复用:

public class Level2: Level1
{
    public override void Encrypt(byte[] plain)
    {
        Console.WriteLine("level2");
        Console.WriteLine("Calling base class");
        base.Encrypt(plain);
    }

    // 封装调用Level1的Encrypt方法,保护级别限制仅派生类可访问
    protected void InvokeLevel1Encrypt(byte[] plain)
    {
        base.Encrypt(plain);
    }
}

public class Level3: Level2
{
    public override void Encrypt(byte[] plain)
    {
        Console.WriteLine("Level3");
        base.Encrypt(plain);
        // 直接调用封装好的方法
        InvokeLevel1Encrypt(plain);
    }
}

这种方式比临时方案更具可维护性,多个方法可以批量封装,避免重复逻辑。

方法3:反射调用(不推荐)

如果前两种方法都无法满足需求,可以通过反射直接调用目标基类的方法,但反射会带来性能损耗,且代码可读性差,仅作为极端场景的备选:

public class Level3: Level2
{
    public override void Encrypt(byte[] plain)
    {
        Console.WriteLine("Level3");
        base.Encrypt(plain);
        
        // 反射获取Level1的Encrypt方法并调用
        var encryptMethod = typeof(Level1).GetMethod(
            "Encrypt", 
            System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance
        );
        encryptMethod?.Invoke(this, new object[] { plain });
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:05:12