我正在为简单的棋盘游戏等制作通用游戏引擎。我正在定义接口,我将要求每个游戏实现我有IGame,IGameState,IBoardEvaluator和IMove等类。
我有像IGame.PerformMove(IMove move)这样的方法,我想限制。如果我正在玩tic-tac-toe,我想强制说我只能使用TTTGame,TTTState,TTTMove等具体课程......
我可以想到几种方法来做到这一点,但没有一个听起来很有趣。也许所有类都可以有一个通用参数,我可以确保它匹配。
so IGame<T> has method PerformMove(IMove<T> move)
如果有效,我就不知道要用什么类。可能没关系。
我的另一个想法是在IGame上放置一堆通用参数,并为它提供我需要的所有类。所以我会创建class TTTGame<TTTMove,TTTState,TTTMove....>
这也不是很好。这样做有共同的模式吗?
答案 0 :(得分:2)
我不明白你指定TTTGame类只能使用TTTMoves会有什么好处。
我认为你可能在这里过度工程。
通过这样做,你唯一保护自己的是一些流氓MonopolyMove类变得自我意识并将自己置于你的代码中。
我说坚持使用接口定义并避免使用泛型,除非你有一个非常有效的案例。我没有根据你提到的内容看到一个。
答案 1 :(得分:1)
接口的全部意义在于不关心类的具体实现。因此,我认为不需要直接强制执行某个类,在这种情况下,可以使用一个参数来传递类本身。
如
TTTGame : IGame
{
PerformMove(TTTMove move);
}
也许这就是你所说的。
public interface IGame<T> where T:IMove
{
void PerformMove(T move);
}
public class TTTGame : IGame<TTTMove>
{
public void PerformMove(TTTMove move)
{
//perform move
}
}
现在你的IGame被迫接受了一个IMove,但是就像你说的那样......如果有更多的课程,比如(IState..etc),这将很快变得混乱。
答案 2 :(得分:1)
我要说的是,你觉得需要将接口的实现限制在某些类中,这表明接口不够具体。
首先IGame
真是个好主意吗?该名称表明它对于tic-tac-toe和Quake同样有效。当然,不同的棋盘游戏之间存在一些相似之处(例如表演动作),但是你真的会从那个高级别的抽象中受益吗?