最好的OOP方式代表棋子
考虑具有一个国际象棋应用Board
含有国际象棋的阵列Piece
秒。 考虑到每个选择的优缺点,以下哪一项是设计Piece
对象的最佳面向对象的方式:
enum
棋子类型的piece_type
属性, Piece
接口,所有作品都继承自这个接口,这将会产生6个其他类的开销,每个类都对应一个独特的棋子。 第一种选择具有轻量级的优点,并且使用了每个棋子涉及很多类似代码的事实,但不太“OOP”。 第二个选项为每个棋子定义一个对象,但可能必须包含大量复制的代码和其他源文件。
考虑到上述情况,哪一种方法是国际象棋Piece
最“OOP”的设计?
绝对是第二个。 原因是不同的棋子不仅仅是不同的类型,他们有完全不同的行为。
因此,将它分解成不同的类别,可以让你指定正确的移动(没有两个单位一样移动)和攻击(例如对角线的棋子攻击),而且每个棋子都具有多态性,而无需在单个类中使用巨大的开关/子句子句。
至于复制代码,这绝对是不好的; 如果您发现自己需要复制代码,最好将该特定代码移到单独的类中,但我不确定需要复制哪些内容 - 每个代码片段都是不同的。
至于额外的源文件,这是你应该几乎不用担心的。 如果你在所有文件中迷路了,最好以不同的方式组织它,例如将所有棋子类放在它们自己的文件夹中。
更新(来自评论):游戏应该决定棋子移动,但棋子决定如何。 例如,如果你想为用户提供反馈,用户将点击一个单位,游戏会询问单位它可以移动的位置(因为只有单位知道它可以移动的位置),一旦用户会确认目标,游戏会告诉单位移动到(有效!)目标。 所以游戏提供了棋子和用户之间的互动,但棋子提供了每件棋子特有的行为。
然而,确实很好的答案是,我会从答案中省略任何“ 肯定 ”,特别是与面向对象相关的主题......我假设每次解决这样的问题时,您都会达到不同的设计概念。
国际海事组织有几种选择,任何组合和匹配都可以工作并合理实施。 例如,定义类“运动”来刻画派片可以制作的不同动作。 不同的棋子在某些游戏中实际上可以使用相同的动作。
接口与基类的定义,再次,取决于你是否看到任何属性的类或不。 我看到几个(类型,分配的动作,主动/非主动等) - 实际上喊“基类”...
对于实际的游戏,是否有一个“玩家”类实际实例化“移动”? 只是想一想。
链接地址: http://www.djcxy.com/p/51041.html