首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对泛型类进行分组?

如何对泛型类进行分组?
EN

Stack Overflow用户
提问于 2009-12-16 13:40:29
回答 3查看 234关注 0票数 3

我正在为简单的棋盘游戏和类似的通用游戏引擎工作。我正在定义我将要求每个游戏实现的接口,我有像IGame、IGameState、IBoardEvaluator和IMove这样的类。

我有像IGame.PerformMove(IMove move)这样的方法,我想限制它们。如果我在玩井字游戏,我想强制我只能使用具体的类TTTGame,TTTState,TTTMove等……

我可以想出几种方法来做到这一点,但没有一种听起来很有趣。也许所有类都可以有一个泛型参数,我可以确保它匹配。

代码语言:javascript
运行
复制
so IGame<T> has method PerformMove(IMove<T> move) 

如果成功了,我就不知道该为T使用哪个类了,也许这并不重要。

我的另一个想法是将一堆泛型参数放在IGame上,并为它提供我需要的所有类。因此,我将创建class TTTGame<TTTMove,TTTState,TTTMove....>

这也不是很好。有没有一种通用的模式来做这件事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-16 13:54:19

我看不出指定您的TTTGame类只能接受TTTMoves有什么好处。

我想你可能在这里太过工程学了。

通过这样做,您可以保护自己免受的唯一一件事是某个流氓MonopolyMove类变得有自我意识,并将自己放入您的代码中。

我建议坚持使用接口定义,避免泛型,除非你有一个真正有效的案例。根据你所提到的,我看不出有什么好的。

票数 2
EN

Stack Overflow用户

发布于 2009-12-16 13:50:53

接口的全部意义在于不关心类的具体实现。因此,我认为没有必要只直接强制执行某个类,在这种情况下,可以通过一个参数来传递类本身。

比如

代码语言:javascript
运行
复制
TTTGame : IGame 
{
    PerformMove(TTTMove move);
}

也许这就是你所说的。

代码语言:javascript
运行
复制
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),这很快就会变得混乱。

票数 1
EN

Stack Overflow用户

发布于 2009-12-16 14:24:40

我要说的是,您觉得有必要将接口的实现限制为某些类,这表明接口不够具体。

首先,IGame真的是一个好主意吗?这个名字表明它对tic-tac-toe和Quake同样有效。当然,不同的棋盘游戏之间有一些相似之处(比如执行走法),但在这么高的级别创建抽象真的会让你受益吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1912548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档