我正在为简单的棋盘游戏和类似的通用游戏引擎工作。我正在定义我将要求每个游戏实现的接口,我有像IGame、IGameState、IBoardEvaluator和IMove这样的类。
我有像IGame.PerformMove(IMove move)这样的方法,我想限制它们。如果我在玩井字游戏,我想强制我只能使用具体的类TTTGame,TTTState,TTTMove等……
我可以想出几种方法来做到这一点,但没有一种听起来很有趣。也许所有类都可以有一个泛型参数,我可以确保它匹配。
so IGame<T> has method PerformMove(IMove<T> move) 如果成功了,我就不知道该为T使用哪个类了,也许这并不重要。
我的另一个想法是将一堆泛型参数放在IGame上,并为它提供我需要的所有类。因此,我将创建class TTTGame<TTTMove,TTTState,TTTMove....>
这也不是很好。有没有一种通用的模式来做这件事?
发布于 2009-12-16 13:54:19
我看不出指定您的TTTGame类只能接受TTTMoves有什么好处。
我想你可能在这里太过工程学了。
通过这样做,您可以保护自己免受的唯一一件事是某个流氓MonopolyMove类变得有自我意识,并将自己放入您的代码中。
我建议坚持使用接口定义,避免泛型,除非你有一个真正有效的案例。根据你所提到的,我看不出有什么好的。
发布于 2009-12-16 13:50:53
接口的全部意义在于不关心类的具体实现。因此,我认为没有必要只直接强制执行某个类,在这种情况下,可以通过一个参数来传递类本身。
比如
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,但就像你said..with更多的类一样(IState..etc),这很快就会变得混乱。
发布于 2009-12-16 14:24:40
我要说的是,您觉得有必要将接口的实现限制为某些类,这表明接口不够具体。
首先,IGame真的是一个好主意吗?这个名字表明它对tic-tac-toe和Quake同样有效。当然,不同的棋盘游戏之间有一些相似之处(比如执行走法),但在这么高的级别创建抽象真的会让你受益吗?
https://stackoverflow.com/questions/1912548
复制相似问题