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

如何无需强制转换从父类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类:

  1. 定义访客接口:
public interface IMobVisitor {
    void VisitPassive(Passive passive);
    void VisitHostile(Hostile hostile);
}
  1. 给Mob类添加Accept方法:
public abstract class Mob {
    protected Room room;
    public abstract void Accept(IMobVisitor visitor);
}
  1. 子类实现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);
    }
}
  1. 实现攻击逻辑的访客类:
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();
    }
}
  1. 调用方式:
var attackVisitor = new AttackVisitor(player);
myRoom.Mob.Accept(attackVisitor);

这种方式适合交互场景较多的情况,扩展性更强,但比多态方案复杂度更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:15:35