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

在C#重写方法中能否使用base.base直接调用顶级基类方法?

如何在子类中跳过中间父类直接调用基类方法?

你希望在B类的重写方法里执行专属逻辑后,跳过A类的相关逻辑,直接调用BaseClass中的createArrays方法,但C#并不支持base.base这种语法。以下是几种可行的实现思路:

方案1:拆分基类核心逻辑为非虚方法

把BaseClass中createArrays的实际工作代码抽成一个独立的非虚protected方法,这样子类可以直接调用这个核心方法,绕过中间父类的重写逻辑:

public class BaseClass
{
    protected virtual void createArrays(int vertexCount)
    {
        CreateArraysCore(vertexCount);
    }

    // 提取核心逻辑为非虚方法,供子类直接调用
    protected void CreateArraysCore(int vertexCount)
    {
        // do the actual work
    }
}

public class A : BaseClass
{
    protected override void createArrays(int vertexCount)
    {
         // Do something specific to A
         base.createArrays(vertexCount);
    }
}

public class B : A 
{
    protected override void createArrays(int vertexCount)
    {
        //Do something specific to B, but not to A
        CreateArraysCore(vertexCount); // 直接调用BaseClass的核心逻辑
    }
}

方案2:通过反射调用基类方法

利用反射直接获取并调用BaseClass中的createArrays方法,这种方式属于hack手段,会失去编译时检查且有性能损耗,但能实现需求:

public class B : A 
{
    protected override void createArrays(int vertexCount)
    {
        //Do something specific to B, but not to A
        var baseMethod = typeof(BaseClass).GetMethod(
            "createArrays", 
            System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic
        );
        baseMethod?.Invoke(this, new object[] { vertexCount });
    }
}

方案3:修改中间父类A提供可控入口

如果允许修改A类,可以新增一个重载方法,让子类能选择是否执行A类的专属逻辑:

public class A : BaseClass
{
    protected override void createArrays(int vertexCount)
    {
        createArrays(vertexCount, true);
    }

    // 新增重载方法,通过参数控制是否执行A类逻辑
    protected void createArrays(int vertexCount, bool runASpecificLogic)
    {
        if (runASpecificLogic)
        {
            // Do something specific to A
        }
        base.createArrays(vertexCount);
    }
}

public class B : A 
{
    protected override void createArrays(int vertexCount)
    {
        //Do something specific to B, but not to A
        createArrays(vertexCount, false); // 传入false跳过A类逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:07:25