自定义对象的枚举
本文关键字:枚举 对象 自定义 | 更新日期: 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);
}
}