我希望能夠從 GameState 物件呼叫方法,如下所示:
public void some_method (GameState s)
{
GameState s_copy = s.duplicate()
s_copy.make_move()
//s_copy now has made a move, but s remains untouched.
}
所以類 GameState 應該有:
- make_move 方法。
- 重復的方法。Duplicate 用于創建物件的深層副本,以便我可以在 GameState 中移動而不更改原始物件。
這讓我相信我需要創建一個界面,因為我可以有多個游戲。這是我感到困惑的地方。我目前正在嘗試:
public interface IGameState
{
void make_move();
GameState duplicate();
}
public class GameState : IGameState
{
public virtual void make_move(){}
public virtual GameState duplicate(){}
}
public class Game1 : GameState
{
public override void make_move(){ /*whatever a move is in game 1*/}
public GameState override duplicate() { /*deepcopy of the class variables*/ }
}
public class Game2 : GameState
{
public void make_move(){ /*whatever a move is in game 2*/}
GameState duplicate() { /*deepcopy of the class variables*/ }
}
因此,當我呼叫“some_method”時,我希望能夠傳遞任何游戲物件:
g1 = new Game1();
g2 = new Game2();
some_method((GameState)g1);
some_method((GameState)g2);
但是我似乎無法訪問這些方法,并且在使用新創建的 GameState 時,duplicate() GameState 型別會造成混亂。我已經閱讀了關于泛型型別、靜態、抽象類和介面的內容,但我無法理解這應該如何完成,并且到目前為止感覺是錯誤的。
Edit: Game1 and Game2 are completely different games: othello and tictactoe let's say
uj5u.com熱心網友回復:
您不想GameState在游戲之間更改物件。因此,GameState為每個游戲創建一個物件,前提是每個游戲共享相同的游戲狀態定義。
public class GameState
{
public string State {get;set;} = ""
}
public class Game {
private readonly GameState state;
public Game(GameState state) {
this.state = state;
}
public void Play() {
state = "Game is Starting";
}
}
var g1 = new Game(new GameState() { State = "Game1State" });
var g2 = new Game(new GameState() { State = "Game2State" });
g1.Play();
uj5u.com熱心網友回復:
我認為您可以通過應用一些小的更改來克服您的問題:
public interface IGameState
{
// Just Naming Conventions here
void MakeMove();
IGameState Duplicate();
}
// Get rid of GameState class
public class Game1 : IGameState // implement the interface
{
public void MakeMove(){ /*whatever a move is in game 1*/}
public IGameState Duplicate() { /*deepcopy of the class variables*/ }
}
// Game2 accordingly
// then `SomeMethod` should work like this:
public void SomeMethod (IGameState s)
{
IGameState s_copy = s.Duplicate();
s_copy.MakeMove();
//s_copy now has made a move, but s remains untouched.
}
為了保持更改,您可能希望回傳變異狀態:
public IGameState SomeMethod (IGameState s)
{
IGameState s_copy = s.Duplicate();
s_copy.MakeMove();
return s_copy;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/325633.html
標籤:c# inheritance interface abstract-class generic-type-argument
上一篇:瀏覽器中必須掌握的奇怪知識~
