【问题标题】:C++ - is there a way to inherit some functions only once, while others multiple times in multiple inheritance?C++ - 有没有办法只继承一些函数一次,而其他函数则在多重继承中多次?
【发布时间】:2019-04-26 09:12:53
【问题描述】:

我的问题如下:

我正在用 C++ 创建一个国际象棋游戏,有一个基类 Figure,其中包含所有图形共享的功能,其中一个虚函数 checkMove 为每个图形单独重新定义(当然,每个图形根据不同的规则移动)。棋盘是指向Figures 的二维指针数组(空方格就是空指针)。

问题是,我想让Queen 继承Rook 和Bishop,因为它是所有意图和目的的混合,而不是编写自己不必要的长checkMove 覆盖.

然后我的问题来了:在基础Figure 类中,有一些基本功能可以定义图形将在控制台中代表哪个角色,它属于哪个团队等。我希望女王只继承这些函数的一个实例。

但是,我希望女王继承checkMove 函数两次——一次来自Rook,一次来自Bishop,以便在其自己的checkMove 版本中简单地调用两者..

我尝试了一些解决方案,还尝试了Rook 和Bishop 虚拟继承Figure 类,但是我似乎无法将这些部分放在一起。我对多态性的概念不熟悉,所以我找不到合适的逻辑来实现该功能。什么是好的方法?

【问题讨论】:

  • “我想让女王继承 Rook 和 Bishop”不要。女王不是车。女王不是主教。不要滥用继承权。并保持简单。另外,学习使用一些空格来帮助我们阅读您的问题。
  • 好读:en.wikipedia.org/wiki/SOLID(尤其是 L 部分;)
  • 您可以创建实用函数来检查水平和对角线移动,并根据需要调用它们以重用代码,而无需求助于继承。
  • “如果它像鸭子一样嘎嘎叫,像鸭子一样移动,但需要电池,你可能有错误的抽象。” vegibit.com/liskov-substitution-principle
  • 一旦我相信继承是每颗钉子的正确锤子,当我意识到事实并非如此时,我松了一口气。一个简单的事实是:如果你想从 Rook 那里继承一个 Queen,那么你就做错了。暂时完全忘记继承,重新考虑您的设计

标签: c++ oop chess


【解决方案1】:

皇后不是车。

我会(远离)这里的继承——唯一的重用真的只给女王。

这里更好的设计应该是这样的(伪代码):

struct Queen {
  ValidMoves canMove(GameState state) {
    ValidMoves res;
    res.insert( canMoveAsRook(state) );
    res.insert( canMoveAsBishop(state) );
    return res;
  }
};

【讨论】:

    【解决方案2】:

    是的,有。

    但这并不是直接显而易见的。您不会从 Rook 和 Bishop 继承 Queen。相反,您引入了一个特定的Move 基类。现在QueenMove 可以从RookMove 和BishopMove 继承。 Queen 只是一个Piece 类型,其构造函数将Piece::move(unique_ptr<Move>)设置为QueenMove。

    【讨论】:

    • 又名策略模式:)
    • 我会说QueenMove继承自Move并且有一个集合(向量?)Move实例,包含一个RookMove和一个BishopMove(或者只是两者中的两个成员) types)为了检查一个有效的移动,它询问两个 Moves 实例,如果两个实例之一返回 true,则返回 true。恕我直言,处理多重继承会使事情变得更加复杂
    • 我不会关联QueenMove 和RookMove。车可以参与易位。女王不能。
    • @GianPaolo:鉴于它专门是 QueenMove,为什么要使用集合?它可以有 2 个命名成员。但是基类或命名成员在这里几乎相同,都是子对象。
    • @Peter:没错,但 castling 既不是 KingMove 也不是 RookMove。它有一套完全独特的规则(例如,不仅由棋子的位置决定,而且唯一的移动是两个棋子在一层中移动)
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2013-09-06
    • 2014-06-02
    • 1970-01-01
    • 2015-05-01
    相关资源
    最近更新 更多