【问题标题】:C# Different Behaviours in a method according to the variable stateC#根据变量状态在方法中的不同行为
【发布时间】:2023-02-10 23:20:41
【问题描述】:
public class Tile
{
   State state ;

   public void OnStep()
   {
       if(state == State.normal) { // Do something; }
       else if(state == State.empty) { // Do something; }
       else if(state == State.hazard) { // Do something; }

   }
}

基本上,OnStep 将根据“状态”变量执行不同的行为。

我真的很想删除那些“if 语句”,但我不想将 Tile 类更改为抽象类。它现在可以工作,但我想知道是否有更好的技术来管理它。当前“状态”是枚举。 (我想知道是否有什么东西可以同时绑定状态和动作)。

【问题讨论】:

  • “我真的很想删除那些‘if 语句’,但我不想将 Tile 类更改为抽象类。”那会有什么关系?
  • “目前'状态'是枚举。(我想知道是否有任何东西可以同时绑定状态和动作)”当然。其一,您可以使用 switch 而不是 if/else。但这只是一个很小的变化。但是你可以使用例如策略模式......基本上这是一个状态机,对吧?
  • 这实际上取决于那些//Do somethings 的性质。如果它们每个都可以被同一个类中的无参数方法替换,那么 state 可能只是一个 Action 而不是更新以反映接下来应该调用哪个方法。还取决于 state 的其他用途。当您到目前为止从您的问题中抽象出您的示例以致有如此多的答案时,这就是问题所在可能有可能。
  • 你的选择是,使用switch,使用Dicitonary<State, Action>,或者你似乎表明这不是你想要做的,为Tile可以拥有的每个StateTile上创建子类(这仅当 State 不可变时才有意义)
  • @Fildor,起初我想把 Tile 做成抽象类并为每个状态创建不同的子类(而不是 if 语句)

标签: c#


【解决方案1】:

所以我知道你想从Tile类中提取逻辑......

public class Tile
{
   private IState _state;

   public void OnStep()
   {
       _state = _state.Step();
   }
}

public interface IState
{
    IState Step();
}

public class NormalStep: IStep
{
    public IStep Step()
    { 
       /*Step logic*/ 
       // Just an example
       if( encounter.HazardousObject ) return new HazardStep();
       return this;
    }
}

public class HazardStep: IStep
{
    public IStep Step(){ /*Step logic*/ }
}

public class EmptyStep: IStep
{
    public IStep Step(){ /*Step logic*/ }
}

那将是最简单的情况。从这里你总是可以变得更复杂。例如状态数据...

【讨论】:

  • 换句话说,学习四人组设计模式——无论如何都应该这样做——然后选择状态模式来解决这个问题。
  • 如果你那样说......是的,基本上就是这样。 @madreflection
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多