如何让派生类必须实现基类含默认逻辑的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
相关产品推荐
相关产品推荐

