删除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