繁体   English   中英

C# 如何正确编码可重用类?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM