如何分组泛型类?

时间:2009-12-16 05:40:29

标签: c# generics

我正在为简单的棋盘游戏等制作通用游戏引擎。我正在定义接口,我将要求每个游戏实现我有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....>

这也不是很好。这样做有共同的模式吗?

3 个答案:

答案 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同样有效。当然,不同的棋盘游戏之间存在一些相似之处(例如表演动作),但是你真的会从那个高级别的抽象中受益吗?