我的问题如下:
我正在用C ++创建一个国际象棋游戏,并且有一个基类Figure
,其中包含所有图形共享的功能,以及为每个图形分别重新定义的虚函数checkMove
(例如,当然,每个人物的移动规则都不同。棋盘是指向Figure
的指针的二维数组(空正方形只是空指针)。
问题是,我想让Queen
继承Rook
和Bishop
,因为它既出于意图又出于目的混合在一起,而不是自己编写不必要的长checkMove
覆盖。
接下来是我的问题:在基础Figure
类中,有一些基本功能来定义图形将在控制台中代表哪个字符,它属于哪个团队等,我希望只能继承这些功能的一个实例。
但是,我希望女王继承两次checkMove
函数-一次从Rook
继承,一次从Bishop
继承,以便简单地自己调用{ {1}}版本。
我尝试了一些解决方案,它们实际上也继承了checkMove
和Rook
继承了Bishop
类,但是我似乎无法将各个部分组合在一起。我是多态概念的新手,所以我找不到合适的逻辑来实现该功能。什么是好的方法?
答案 0 :(得分:2)
女王不是白痴。
我会在这里避开继承-唯一的重用实际上只为女王。
这里的更好设计应类似于以下内容(伪代码):
struct Queen {
ValidMoves canMove(GameState state) {
ValidMoves res;
res.insert( canMoveAsRook(state) );
res.insert( canMoveAsBishop(state) );
return res;
}
};
答案 1 :(得分:1)
是的,有。
但这不是直接明显的。您不会从Queen
和Rook
继承Bishop
。相反,您将引入一个特定的Move
基类。现在QueenMove
可以从RookMove
和BishopMove
继承。 Queen
只是Piece
类型,其构造函数将Piece::move
(一个unique_ptr<Move>
)设置为QueenMove
。