Сначала я просто заявляю, что я использую одиночные игры, которые на самом деле не будут существовать на протяжении всего срока службы приложения. Это больше способ инкапсулировать то, что происходит от пользователя.Singleton & Inheritance C#
У меня есть несколько GameStates, например InGame или MainMenu, и у них есть довольно похожие вызовы функций, поэтому я решил использовать наследование для остановки копирования/вставки. Следующий код - это то, что у меня есть, но он не работает, как я предполагаю. Вот оно:
BaseState.cs
abstract class BaseState
{
protected static BaseState mHandle = null;
protected static BaseState Handle
{
get
{
return mHandle;
}
set
{
mHandle = value;
}
}
public static GameState UpdateState(GameTime gameTime)
{
GameState g = GameState.MainMenu;
try
{
Handle.Update(gameTime);
}
catch (Exception e)
{
}
return g;
}
public static void DrawState(GameTime gameTime, SpriteBatch spriteBatch)
{
Handle.Draw(gameTime, spriteBatch);
}
public static void Release()
{
mHandle = null;
}
protected abstract GameState Update(GameTime gameTime);
protected abstract void Draw(GameTime gameTime, SpriteBatch spriteBatch);
}
InGame.cs
class InGame : BaseState
{
private InGame()
{
}
protected static new BaseState Handle
{
get
{
if (mHandle == null)
{
mHandle = new InGame();
}
return mHandle;
}
set
{
mHandle = value;
}
}
protected override GameState Update(GameTime gameTime)
{
return GameState.Quit;
}
protected override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
{
}
}
Вы, наверное, можно сказать, что я хочу, чтобы иметь возможность использовать get
и set
из InGame
в BaseState
так Я могу просто вызвать Handle.Update(), и независимо от того, вызвал ли я его из InGame или Menu или что бы он знал, какой код использовать.
Очевидно, мне нужно освежить свои навыки OO. Но если кто-нибудь может предложить способ заставить это делать то, что я хотел бы, или предложить другой способ этого, я был бы благодарен. Благодарю.
Где GameState определяется? И вы должны сделать функцию виртуальной, чтобы иметь возможность называть ее из базового класса, но запускать поведение производного класса (полиморфизм). Поэтому ваш сеттер/получатель должен быть виртуальным. Кроме того, InGame.Update просто возвращает GameState.Quit, это было предназначено? –
GameState - простое перечисление. Да, он возвращает GameState.Quit намеренно на данный момент Они не могут быть виртуальными, поскольку они являются статическими, два являются противоположностями друг друга, я думаю? Это дает ошибки компиляции, по крайней мере; Я попробовал ключевое слово 'new', так как казалось, что это то, что я хотел, и оно скомпилировано. Не делал то, что я ожидаю. – Luke
Я не думаю, что вам нужен синглтон в вашем случае, но простой и простой полиморфизм. Один синглтон подразумевает, что только один экземпляр типа может существовать в любой точке, но в вашем случае я считаю, что несколько состояний могут сосуществовать. Подумайте об этом, когда вы переходите из состояния игры в состояние меню и обратно, вы не ожидаете, что ваш игровой экземпляр будет уничтожен, но с одним синглом вам придется. –