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

如何让派生类必须实现基类含默认逻辑的Virtual方法?

实现强制派生类重写带默认逻辑方法的可行方案

你需要基类方法包含固定逻辑,同时强制所有派生类必须重写该方法,不能直接使用基类的默认实现。C#本身不支持abstract virtual的组合语法,但可以通过以下两种方案实现需求:

方案1:拆分方法(抽象强制实现 + 受保护固定逻辑)

将基类的固定逻辑封装到一个受保护的非虚方法中,把对外暴露的AttackFinished设为抽象方法,强制派生类必须实现该方法,同时允许派生类在自己的实现中调用基类的固定逻辑。

// 基类
public abstract class Attack : MonoBehaviour
{
    // 强制派生类必须实现的抽象方法
    public abstract void AttackFinished();

    // 封装固定逻辑的受保护方法,供派生类调用
    protected void BaseAttackFinished()
    {
        Entity.StateController.SwitchToState<IdleState>();
    }
}

// 派生类
public class PlayerSwordAttack : Attack
{
    // 必须实现抽象方法,否则编译报错
    public override void AttackFinished()
    {
        // 调用基类固定逻辑(时机可由派生类自由控制)
        BaseAttackFinished();
        // 派生类自定义逻辑
        // Extra stuff
    }
}

方案2:模板方法模式(固定流程 + 强制扩展点)

如果需要基类严格控制执行流程(比如确保固定逻辑一定会被执行),可以使用模板方法模式:基类对外提供一个不可重写的公共方法定义固定流程,其中包含一个必须由派生类实现的抽象扩展方法。

// 基类
public abstract class Attack : MonoBehaviour
{
    // 对外的公共方法,固定执行流程,不可重写
    public void AttackFinished()
    {
        // 基类固定逻辑
        Entity.StateController.SwitchToState<IdleState>();
        // 调用派生类必须实现的扩展逻辑
        OnAttackFinished();
    }

    // 强制派生类实现的扩展点
    protected abstract void OnAttackFinished();
}

// 派生类
public class PlayerSwordAttack : Attack
{
    // 必须实现抽象方法,否则编译报错
    protected override void OnAttackFinished()
    {
        // 派生类自定义逻辑
        // Extra stuff
    }
}

方案对比

  • 方案1灵活性更高:派生类可以自由决定基类固定逻辑的调用时机(比如先执行自定义逻辑再调用基类);
  • 方案2流程更可控:由基类确保固定逻辑的执行顺序,派生类只需专注于实现扩展部分。

内容的提问来源于stack exchange,提问作者Chris is Awesome

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:11:06