Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型抽象枚举_C#_Unity3d - Fatal编程技术网

C# 泛型抽象枚举

C# 泛型抽象枚举,c#,unity3d,C#,Unity3d,我正在为我的Unity实验在状态机上工作,我想创建一个负责单个对象状态的系统 我的愿景是: StateManager—负责转换状态等的类 StateCollection—抽象类,其中派生类将保存对象的所有状态实例 枚举-我想使用枚举来选择现在应该处于活动状态的状态 我的实现如下所示: public class StateManager<T,enumT> where T : StateCollection, new() where enumT : Enum { private T

我正在为我的Unity实验在状态机上工作,我想创建一个负责单个对象状态的系统

我的愿景是:

StateManager—负责转换状态等的类

StateCollection—抽象类,其中派生类将保存对象的所有状态实例

枚举-我想使用枚举来选择现在应该处于活动状态的状态

我的实现如下所示:

public class StateManager<T,enumT> where T : StateCollection, new() where enumT : Enum
{

  private T states = new T();
  public T States 
  {
      get { return states;}
  }

  public void TransformState(enumT newState)
  {
    //some code
  }
}

public abstract class StateCollection
{

  public GameObject Object { get; set; }
  public abstract State GetState<enumT>(enumT enumState);
}

public class PlayerStatesCollection<enumT> : StateCollection
{

  private PlayerIdleState Idle = new PlayerIdleState();
  private PlayerShootState Shoot = new PlayerShootState();
  private PlayerMoveState Move = new PlayerMoveState();
  private PlayerDeadState Dead = new PlayerDeadState();



  public override State GetState(enumT enumState)
  {

    switch (enumState)
    {
        case PlayerStates.Idle:
            return Idle;
        case PlayerStates.Move:
            return Move;
        case PlayerStates.Shoot:
            return Shoot;
        case PlayerStates.Dead:
            return Dead;
        default:
            throw new System.Exception("Invalid State. #002");
    }
  }

}

public enum PlayerStates
{
  Idle,
  Shoot,
  Move,
  Dead
}
public StateManager<PlayerStatesCollection<PlayerStates>, PlayerStates> StavManager = new StateManager<PlayerStatesCollection<PlayerStates>, PlayerStates>();
现在,当我创建StateManager实例时,我必须编写如下内容:

public class StateManager<T,enumT> where T : StateCollection, new() where enumT : Enum
{

  private T states = new T();
  public T States 
  {
      get { return states;}
  }

  public void TransformState(enumT newState)
  {
    //some code
  }
}

public abstract class StateCollection
{

  public GameObject Object { get; set; }
  public abstract State GetState<enumT>(enumT enumState);
}

public class PlayerStatesCollection<enumT> : StateCollection
{

  private PlayerIdleState Idle = new PlayerIdleState();
  private PlayerShootState Shoot = new PlayerShootState();
  private PlayerMoveState Move = new PlayerMoveState();
  private PlayerDeadState Dead = new PlayerDeadState();



  public override State GetState(enumT enumState)
  {

    switch (enumState)
    {
        case PlayerStates.Idle:
            return Idle;
        case PlayerStates.Move:
            return Move;
        case PlayerStates.Shoot:
            return Shoot;
        case PlayerStates.Dead:
            return Dead;
        default:
            throw new System.Exception("Invalid State. #002");
    }
  }

}

public enum PlayerStates
{
  Idle,
  Shoot,
  Move,
  Dead
}
public StateManager<PlayerStatesCollection<PlayerStates>, PlayerStates> StavManager = new StateManager<PlayerStatesCollection<PlayerStates>, PlayerStates>();
现在我对这件事有点不满意,看起来。。泛型参数有两个PlayerStates,这是不必要的,因为它总是相同的,我还没有弄清楚如何简单地使用它

StateManager<PlayerStatesCollection,PlayerStates>

如果我创建例如EnemyStatesCollection,它将从StateCollection派生并拥有自己的enum EnemyStates。当我使用StateManager转换状态时,我希望能够使用它自己的枚举,这将在创建StateManager时定义。

您能解释一下将PlayerStatesCollection设置为通用的原因吗?我不明白为什么它应该是通用的。你能解释一下你让PlayerStatesCollection通用的理由吗?我不明白为什么它应该是通用的。