在C#中的派生类中重写枚举

贾维尔斯

我正在abstract使用enum为其接收的可能命令创建一个有限的机器状态类,例如:

public abstract class FSMBase
{
    public enum Commands {};
    public enum States;
    public Dictionary<Transition, States> AvailableTransitions;
    public States CurrentState;

    public abstract void InitCommandsAndStatesAndTransitiosnAndInitialState();

    public void ProcessCommand(Commands _command)
    {
        Transition RequestedTransition = new Transition(CurrentState, command);
        if(AvailableTransitions.TryGetValue(RequestedTransition, out State nextState) //pseudocode
        {
             CurrentState = nextState;
        }
    }
}

然后在派生类中,我想重写States,在TransitionsCommands就像是:

public class MyFSM : FSMBase
{
    public override void InitCommandsAndStatesAndTransitiosnAndInitialState()
    {
        States = {Off, starting, started, ...} //HERE IS MY PROBLEM
        Commands = {start, stop, finish, ...}; // HERE IS MY PROBLEM

        Transitions = new Dictionary<Transition, BaseState>
        {
            {new Transition(States.Off, Commands.Start), States.starting},
            ....
        }

        CurrentState = States.Off;
    }
}

如何重写enum在我的派生S级???

德米特里·拜琴科(Dmitry Bychenko)

好吧,enum实际上是intbyteshortlong),并且不能被覆盖。我建议使用仿制药替代

public abstract class FSMBase<State, Command> 
  where State   : Enum  // : Enum wants C# 7.3+
  where Command : Enum {

  //TODO: I suggest have these fields private, or at least, protected
  public Dictionary<Transition, State> AvailableTransitions;
  public State CurrentState;

  public void ProcessCommand(Command _command) {
    ...
  }

}

实施时,MyFSM您可以放入所需的枚举:

public class MyFSM : FSMBase<MyStates, MyCommands> {
  ...
}

编辑:较低的C#版本的情况下,您可以尝试相同的想法,但要使用不同的约束:

public abstract class FSMBase<State, Command> 
  where State   : struct  
  where Command : struct {

  public State CurrentState;
  ...        

  // Instead of compile time error we are going to have runtime one,
  // if either State or Command is not enum
  static FSMBase() {
    if (!typeof(State).IsEnum)
      throw new InvalidCastException("Generic pararameter State must be enum!");
    else if (!typeof(Command).IsEnum)
      throw new InvalidCastException("Generic pararameter Command must be enum!");
  }
}

...

public class MyFSM : FSMBase<MyStates, MyCommands> {
  public override void InitCommandsAndStatesAndTransitiosnAndInitialState() {
    ...
    CurrentState = MyStates.Off;
    ... 
  }
  ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在派生类中重写C ++模板函数

派生类模板中的条件重写

派生类中的重写方法

在派生类中调用重写的方法

覆盖派生类中的枚举值

在派生类C#中扩展嵌套类

返回派生类型的基类中的C#方法

C# Linq 在 Group By 中创建派生类列表

重写派生类C ++中基类私有成员的行为

在派生类中重写赋值运算符

是否可以在派生类中重写静态方法?

派生类中的私有重写虚拟函数

在基类中声明的C#接口方法无需在派生类中再次实现

C#:在基类中定义方法实现,在派生类中定义属性

您能否将派生类添加到其基类的列表中,然后从C#中的基类列表中调用派生类的方法

在Java中,如何从派生类中的重写方法中调用基类的方法?

从C#中的派生类对象创建新的基类对象

在派生类的C#基类中设置大量属性的最佳实践

C#如何从基类的派生类中获取特定类型的所有字段?

C#:将基类集合对象复制到派生类对象中

创建类型为<派生类>的变量以将<基类>对象存储在C#中

C# 可以让基类中的泛型函数知道调用派生类的类型吗?

在 C# 中使用基类和派生类实例化数组中的对象

是否可以在接口的派生类中仅使用C#中的该接口的某些方法?

C ++类继承在派生类中的单独方法

无法在C ++的派生类中重载基类方法

C ++替换派生类中的基类

C ++:使用基类中的仅派生类变量

代表库中项目的类的c ++派生类