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

如何在并行类层次结构中为状态类引用正确的上下文类?

最佳方案:泛型基状态类

通过泛型约束状态类对应的上下文类型,既能实现类型安全的上下文访问,又能支持状态类的继承关系,完全避免强制类型转换的代码异味。

泛型基类改造

将原有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:23:10