From 47326085e7177f70f788233bd81211b952a73109 Mon Sep 17 00:00:00 2001
From: GeWuYou <95328647+GeWuYou@users.noreply.github.com>
Date: Sat, 17 Jan 2026 10:06:16 +0800
Subject: [PATCH] =?UTF-8?q?fix(state):=20=E4=BF=AE=E6=94=B9=E7=8A=B6?=
=?UTF-8?q?=E6=80=81=E6=9C=BA=E5=88=87=E6=8D=A2=E6=96=B9=E6=B3=95=E8=BF=94?=
=?UTF-8?q?=E5=9B=9E=E5=80=BC=E7=B1=BB=E5=9E=8B=E5=B9=B6=E6=94=B9=E8=BF=9B?=
=?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=A4=B1=E8=B4=A5=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 将ChangeTo方法返回值从void改为bool类型
- 添加转换失败时返回false的逻辑
- 在状态转换被拒绝时调用OnTransitionRejected回调
- 更新接口定义以匹配新的返回值类型
- 修改单元测试以验证转换失败时的返回值
- [skip ci]
---
GFramework.Core.Abstractions/state/IStateMachine.cs | 5 +++--
GFramework.Core.Tests/state/StateMachineTests.cs | 5 +++--
GFramework.Core/state/StateMachine.cs | 12 ++++++++----
3 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/GFramework.Core.Abstractions/state/IStateMachine.cs b/GFramework.Core.Abstractions/state/IStateMachine.cs
index f7ddf1e..7922b63 100644
--- a/GFramework.Core.Abstractions/state/IStateMachine.cs
+++ b/GFramework.Core.Abstractions/state/IStateMachine.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
namespace GFramework.Core.Abstractions.state;
@@ -36,7 +36,8 @@ public interface IStateMachine
/// 切换到指定类型的状态
///
/// 要切换到的状态类型,必须实现IState接口
- void ChangeTo() where T : IState;
+ /// 如果成功切换则返回true,否则返回false
+ bool ChangeTo() where T : IState;
///
/// 检查指定类型的状态是否已注册
diff --git a/GFramework.Core.Tests/state/StateMachineTests.cs b/GFramework.Core.Tests/state/StateMachineTests.cs
index e47743c..87438ee 100644
--- a/GFramework.Core.Tests/state/StateMachineTests.cs
+++ b/GFramework.Core.Tests/state/StateMachineTests.cs
@@ -174,7 +174,7 @@ public class StateMachineTests
}
///
- /// 验证当当前状态拒绝转换时不应发生状态变化
+ /// 验证当当前状态拒绝转换时不应发生状态变化
///
[Test]
public void ChangeTo_WhenCurrentStateDeniesTransition_Should_NotChange()
@@ -186,8 +186,9 @@ public class StateMachineTests
_stateMachine.ChangeTo();
var oldState = _stateMachine.Current;
- _stateMachine.ChangeTo();
+ var result = _stateMachine.ChangeTo();
+ Assert.That(result, Is.False);
Assert.That(_stateMachine.Current, Is.SameAs(oldState));
Assert.That(_stateMachine.Current, Is.SameAs(state1));
Assert.That(state2.EnterCalled, Is.False);
diff --git a/GFramework.Core/state/StateMachine.cs b/GFramework.Core/state/StateMachine.cs
index 08e3b24..a2f1a0a 100644
--- a/GFramework.Core/state/StateMachine.cs
+++ b/GFramework.Core/state/StateMachine.cs
@@ -1,4 +1,4 @@
-using GFramework.Core.Abstractions.state;
+using GFramework.Core.Abstractions.state;
namespace GFramework.Core.state;
@@ -79,8 +79,9 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine
/// 切换到指定类型的状态
///
/// 目标状态类型
+ /// 如果成功切换则返回true,否则返回false
/// 当目标状态未注册时抛出
- public void ChangeTo() where T : IState
+ public bool ChangeTo() where T : IState
{
lock (_lock)
{
@@ -90,10 +91,13 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine
// 验证当前状态是否可以转换到目标状态
if (Current != null && !Current.CanTransitionTo(target))
- throw new InvalidOperationException(
- $"Cannot transition from {Current.GetType().Name} to {typeof(T).Name}");
+ {
+ OnTransitionRejected(Current, target);
+ return false;
+ }
ChangeInternal(target);
+ return true;
}
}