[英]C# how to properly code reusable classes?
我希望能够从 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 类型会造成混乱。 我已经阅读了关于泛型类型、静态、抽象类和接口的内容,但我无法理解这应该如何完成,并且到目前为止感觉是错误的。
编辑:Game1 和 Game2 是完全不同的游戏:比如黑白棋和井字游戏
您不想在游戏之间更改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();
我认为您可以通过应用一些小的更改来克服您的问题:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.