如何无需强制转换从父类Mob对象调用子类Passive/Hostile专属行为?
无需强制转换的Mob攻击行为实现方案
核心思路是利用多态特性,让抽象父类定义统一的行为入口,子类各自实现专属逻辑,上层代码只需要调用统一方法,完全不用关心具体是Passive还是Hostile类型。
步骤1:改造抽象Mob类,添加统一行为入口
在抽象类里定义一个抽象的OnAttacked方法,作为被攻击时的统一调用点:
public abstract class Mob { protected Room room; // 抽象方法:被攻击时的行为,由子类实现 public abstract void OnAttacked(Player attacker); }
(注:假设你有Player类,若没有可根据实际需求调整参数)
步骤2:子类实现专属攻击响应逻辑
让Passive和Hostile分别重写OnAttacked方法,将各自的专属行为嵌入其中:
public class Passive : Mob { // 原有专属方法保留 public void Run() { } public void SayGreeting() { } public void SayGoodbye() { } // 被攻击时执行逃跑逻辑 public override void OnAttacked(Player attacker) { Run(); SayGoodbye(); } } public class Hostile : Mob { // 原有专属方法保留 public void Fight() { } public void SayOnLose() { } public void SayOnWin() { } // 被攻击时执行反击逻辑 public override void OnAttacked(Player attacker) { Fight(); // 后续可扩展战斗结果判断,比如战败时调用SayOnLose } }
步骤3:玩家攻击时直接调用统一方法
现在玩家攻击Mob时,无需任何类型转换,直接调用OnAttacked即可:
// 玩家攻击当前房间内的Mob myRoom.Mob.OnAttacked(player);
可选进阶方案:访客模式(适合多交互场景)
如果后续需要给Mob添加更多不同类型的交互(比如对话、喂食等),可以用访客模式避免频繁修改Mob类:
- 定义访客接口:
public interface IMobVisitor { void VisitPassive(Passive passive); void VisitHostile(Hostile hostile); }
- 给Mob类添加Accept方法:
public abstract class Mob { protected Room room; public abstract void Accept(IMobVisitor visitor); }
- 子类实现Accept方法:
public class Passive : Mob { // 原有方法... public override void Accept(IMobVisitor visitor) { visitor.VisitPassive(this); } } public class Hostile : Mob { // 原有方法... public override void Accept(IMobVisitor visitor) { visitor.VisitHostile(this); } }
- 实现攻击逻辑的访客类:
public class AttackVisitor : IMobVisitor { private Player _attacker; public AttackVisitor(Player attacker) { _attacker = attacker; } public void VisitPassive(Passive passive) { passive.Run(); passive.SayGoodbye(); } public void VisitHostile(Hostile hostile) { hostile.Fight(); } }
- 调用方式:
var attackVisitor = new AttackVisitor(player); myRoom.Mob.Accept(attackVisitor);
这种方式适合交互场景较多的情况,扩展性更强,但比多态方案复杂度更高。
内容的提问来源于stack exchange,提问作者CreativeGuy888
相关产品推荐
相关产品推荐

