其他分享
首页 > 其他分享> > 删除C中类之间的循环依赖关系

删除C中类之间的循环依赖关系

作者:互联网

假设我们正在制作一个双人纸牌游戏,我们有一些名为Game,Player和Card的课程.游戏中包含指向两个玩家的指针.为玩家提供界面.玩家包括玩家的健康状况.他们的魔法以及他们手中的牌矢量.卡是一个抽象类.每张卡都需要玩魔法,并且可以玩.

问题是每张卡在玩时都可以通过多种方式改变游戏状态.例如,我们可以拥有一张能够让玩家健康成倍增加的牌,一张能够让敌方玩家中毒两次的牌,一张可以摧毁棋盘上所有爪子的牌,一张可以在棋盘上创建每个小兵副本的牌等等.可能性真是无穷无尽.我能看到的唯一解决方案是在每张卡片中都有一个指向游戏的指针,但这似乎相当不优雅.

还有其他解决方案吗?

解决方法:

您的基本想法是正确的,但您应该进一步加强它以保持高水平的抽象和封装.

因此,在您的示例中,假设您有一个Card类,它是现有类的一个实例.

您可以做的第一件事是将卡片的效果与卡片本身分开,例如:

class CardEffect {
 // TODO ...
};

class Card {
private:
  const CardEffect* effect;
};

所以现在卡本身不需要了解游戏的任何信息.但让我们深入研究一下:CardEffect不需要知道Game类的每个细节,它需要做的是将效果应用于游戏.这可以通过为效果提供单独的界面来完成,该界面仅暴露应用效果所需的内容,所以这样的事情.

class GameInterface {
public:
  virtual const std::vector<Player*>& getPlayers() = 0;

  virtual damagePlayer(Player* player, int amount) = 0;
  virtual applyPeriodicDamage(Player* player, int turns, int amount) = 0

  ..
};

class CardEffect {
  virtual applyEffect(GameInterface* interface) = 0;
};

class Card {
private:
  const CardEffect* effect;
};

现在这只是一个例子,因为每个特定的场景都不同并且有不同的要求,所以没有明确的问题解决方案,它只是给你一个基本的想法,你可以尝试保持代码优雅和封装,同时保持足够的描述性易于管理.

标签:c,class,oop,circular-dependency
来源: https://codeday.me/bug/20190724/1521037.html