自定义对象的枚举

本文关键字:枚举 对象 自定义 | 更新日期: 2023-09-27 18:13:06

我的目标是创造一种具有一定数量不同状态的"GameState"类型。我希望它的行为几乎完全像enum集合,但我希望有不止一个整数作为数据。

作为一个例子,这是我想做的:

switch(this.gameState)
{
   case(Wait):
      if(elapsedTime > gameState.TimeOutTime)
         //do stuff
   break;
   case(Play):
      if(elapsedTime > gameState.TimeOutTime)
         //do other stuff
   break;
}

所以比起GameState只是一个整数的枚举,我希望它包含像TimeOutTime这样的变量和其他关于GameState的有用信息。

是否有一种方法可以增加枚举的深度,或者我只是在错误的角度攻击这个问题?

自定义对象的枚举

已经有很好的答案了(@Selman22, @Max)。

但是我猜他们错过了一个重要的信息:你应该而不是打开类型。请使用多态性。

所以,根据你的例子,你应该这样写:

public abstract class GameState
{
    public int TimeOutTime { get; set; }
    public void CheckDoStuff()
    {
        if (elapsedTime > gameState.TimeOutTime) DoStuff();
    }
    protected abstract void DoStuff();
}
public WaitState : GameState
{
    protected override DoStuff()
    {
        // Do stuff (wait)
    }
}
public PlayState : GameState
{
    protected override DoStuff()
    {
        // Do other stuff (play)
    }
}

注意:我没有添加任何enum,因为我认为在这种情况下不需要一个。

您需要的是class。你不能用enums这样做,而是添加一个类,并使枚举成为你的类的属性。

class GameState
{
    public GameStateEnum State { get; set; }
    public int TimeOutTime { get; set; }
    // other properties...
}

您可以很容易地为此创建一个类:

public class GameState
{
   public StateEnum State {get; set;}
   public DateTime TimeOutTime {get; set;}
}

创建游戏庄园列表很简单,就像:

List<GameState> gameStateList = new List<GameState>();

您不能使用。net enums(您可以使用Java)

假设您的elapsedTime是一个日期时间,如:

使用系统;

public class GameState
{
    private readonly TimeOutTime _timeOutTime;
    public GameState(TimeOutTime timeOutTime)
    {
        _timeOutTime = timeOutTime;
    }
    public TimeOutTime TimeOutTime { get { return _timeOutTime; } }
}
public class TimeOutTime
{
    private readonly DateTime _dateTime;
    public TimeOutTime(DateTime dateTime)
    {
        _dateTime = dateTime;
    }
    public static implicit operator DateTime(TimeOutTime timeOutTime)
    {
        return new TimeOutTime(timeOutTime);
    }
    public static implicit operator TimeOutTime(DateTime timeOutTime)
    {
        return new TimeOutTime(timeOutTime);
    }
}