如何在并行类层次结构中为状态类引用正确的上下文类?
最佳方案:泛型基状态类
通过泛型约束状态类对应的上下文类型,既能实现类型安全的上下文访问,又能支持状态类的继承关系,完全避免强制类型转换的代码异味。
泛型基类改造
将原有的BaseState改为泛型抽象类,通过泛型约束限定上下文必须继承自ObjectBase:
public abstract class BaseState<TContext> where TContext : ObjectBase { public TContext Context { get; set; } public abstract string GetText(); public abstract bool ShouldUpdateText(); }
上下文类适配
在ObjectBase中添加状态设置方法,自动注入上下文引用,确保状态能拿到正确的强类型上下文:
public class ObjectBase { public BaseState<ObjectBase> State { get; private set; } public string Text { get; set; } public float Data1 { get; set; } public void UpdateText() { if (State?.ShouldUpdateText() ?? false) { Text = State.GetText(); } } public void SetState(BaseState<ObjectBase> state) { State = state; state.Context = this; } }
派生状态类实现
针对不同上下文类型实现泛型状态类,同时支持状态继承:
基础状态(对应ObjectBase)
public class State1 : BaseState<ObjectBase> { public override bool ShouldUpdateText() => Context.Data1 > 0; public override string GetText() => $"Data1 value: {Context.Data1}"; }
派生状态1(对应DerivedObject1)
// 定义支持派生上下文的泛型状态基类 public class State2<T> : BaseState<T> where T : DerivedObject1 { public override bool ShouldUpdateText() => Context.Data2.Length > 2; public override string GetText() => $"Data2 length: {Context.Data2.Length}"; }
派生状态2(继承State2,对应DerivedObject2)
public class State3 : State2<DerivedObject2> { public override bool ShouldUpdateText() => base.ShouldUpdateText() && Context.Data3; public override string GetText() => $"{base.GetText()}, Data3 status: {Context.Data3}"; }
架构优化思路
若想从根源上降低状态与上下文的耦合,可考虑以下方向:
- 依赖倒置:为上下文定义抽象接口(如
IHasData1、IHasData2),状态仅依赖所需接口,而非具体上下文类,减少直接依赖。 - 职责分离:将文本生成逻辑移至上下文或专门的文本生成器类,状态仅负责判断更新时机和触发生成,弱化状态对上下文内部数据的依赖。
内容的提问来源于stack exchange,提问作者Soul
相关产品推荐
相关产品推荐

