C#使用命令模式实现带参方法作为参数传入的问题咨询
代码问题诊断与调整方案
你的当前实现无法正常运行,核心问题是命令模式的封装逻辑缺失、委托与参数没有正确绑定,具体问题如下:
现存问题
- 构造逻辑空实现:
GroupActionItem的构造函数接收了委托参数但没有存储,后续执行时完全取不到传入的方法 - 参数传递链路断裂:你定义的移动委托需要接收
Vector3类型的目标点参数,但现有逻辑没有任何地方存储这个参数,执行时无法把目标点传入移动方法 - 编译错误:
GroupActionMovement中重写的Execute方法调用了无参的Movement(),但Movement方法强制要求传入Vector3参数,代码无法通过编译 - 扩展性不足:当前定义的委托仅支持
Vector3类型参数,后续要新增接收枚举、GameObject等参数的命令时,无法直接复用现有逻辑
调整方案
1. 重构命令基类
将命令的执行逻辑和所需参数封装为整体,所有命令继承同一个抽象基类,对外仅暴露统一的无参执行方法:
// 命令抽象基类 public abstract class GroupActionBase : MonoBehaviour { public abstract bool Execute(); }
2. 实现具体命令类
不同参数类型的命令单独实现,构造时就把执行需要的所有参数存储在类内部:
// 移动命令,接收Vector3参数 public class MoveAction : GroupActionBase { private readonly Vector3 _targetPosition; // 构造时传入移动目标点 public MoveAction(Vector3 targetPosition) { _targetPosition = targetPosition; } public override bool Execute() { // 直接用内部存储的目标点执行移动逻辑 return MoveToPosition(_targetPosition); } private bool MoveToPosition(Vector3 position) { // 你的移动逻辑实现 return true; } } // 示例:后续新增攻击命令,接收GameObject参数 public class AttackAction : GroupActionBase { private readonly GameObject _target; public AttackAction(GameObject target) { _target = target; } public override bool Execute() { // 攻击逻辑实现 return true; } }
3. 简化命令单元类
不需要额外定义委托,直接存储命令基类实例即可:
public class GroupActionItem { private readonly GroupActionBase _action; public GroupActionItem(GroupActionBase action) { _action = action; } public bool PerformAction() { return _action.Execute(); } }
4. 业务调用修改
你最初期望的调用写法可以改为如下形式,完全符合需求:
// 添加移动命令到队列 playerGroupActions.AddAction( new GroupActionItem( new MoveAction(new Vector3(-1000,-1000,-1000))));
可选优化
你当前的PerformActions方法每帧仅执行队列第一个命令,如果你需要每帧执行所有已完成的命令,可以修改为循环执行逻辑,现有逻辑如果符合你的设计需求可以保留。
内容的提问来源于stack exchange,提问作者AsadChaudhry
相关产品推荐
相关产品推荐

