首先,我將說明我使用的單身人士實際上並不會在整個應用程序生命週期中。這更多的是封裝用戶所發生的事情的一種方式。單身人士和繼承C#
我有幾個GameState,例如InGame或MainMenu,這些函數調用非常相似,所以我想用inheritence來停止複製/粘貼。下面的代碼就是我所擁有的,但它並不像我打算的那樣工作。那就是:
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)
{
}
}
你也許可以告訴我希望能夠使用的InGame
的get
和set
在BaseState
如此我可以簡單地調用Handle.Update(),不管是從InGame還是Menu中調用它,或者不管它會知道使用哪個代碼。
顯然我需要刷新我的面向對象技能。但是,如果任何人都可以提出一種方法來讓它做我想做的事,或者提出一種不同的方式去實現它,我將不勝感激。謝謝。
哪裏是遊戲狀態定義?你必須做一個虛擬函數才能夠從基類中調用它,但觸發派生類行爲(多態)。所以你的setter/getter應該是虛擬的。另外,InGame.Update只是返回GameState.Quit,是否有意? –
GameState是一個簡單的枚舉。 是的,它現在故意返回GameState.Quit 它們不能是虛擬的,因爲它們是靜態的,我認爲它們是相互對立的?它至少給編譯錯誤;我嘗試了'new'關鍵字,因爲它好像是我想要的,並且它被編譯。沒有做我期望的。 – Luke
我不認爲你需要一個單例,但簡單而簡單的多態。一個單例意味着只有一個類型的實例可以在任何時候存在,但在你的情況下,我相信多個狀態可以共存。考慮一下,當你從遊戲狀態轉到菜單狀態並返回時,你不會期望你的遊戲實例被破壞,但是你必須使用一個單例。 –