在 C++ 中,我如何声明一个接口(interface) s.t.我可以如下所示使用它:
/** Enemy "Interface" */
Class Enemy {
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
/** Enemy of type 1 */
Class Enemy_type1 : public Enemy {
Enemy_type1();
virtual ~Enemy_type1();
virtual void doStuff() {
// different for every type of enemy
}
};
/** Add an enemy to EnemyManager */
void EnemyManager::addEnemy(Enemy * e) {
this->enemies.push_back(*e); // declared as vector<Enemy> enemies;
}
最佳答案
首先,您必须(或至少想要)将构成您的界面的函数公开:
class Enemy {
public:
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
然后您将从它继承(C++ 没有“接口(interface)”和“类”作为单独的概念)。
class Emeny_type1 : public Enemy {
// ...
};
最后,由于这些是多态类型,您需要创建一个指向敌人的指针集合,而不是实际的 Enemy 对象:
void EnemyManager::addEnemy(Enemy const *e) {
enemies.push_back(e);
}
这确实引发了对象生命周期和所有权的问题(这在 Java 中大多不是问题)。当你将一个项目添加到收藏中时,你需要确保它在你要使用它的时候不会被销毁,并且一旦你用完它就会被销毁(例如,当一个敌人被打败时,你可能想删除它)。您需要决定 EnemyManager 是要删除不再需要的敌人,还是要删除一些其他代码。如果 EnemyManager 要删除它们,您可能需要(或想要)向 Enemy 接口(interface)添加一个 clone
函数,以便它获取要添加到集合中的对象的拷贝。
编辑:根据您的评论,您不太确定如何使用您收藏中存储的指针的 Enemy“界面”。幸运的是,这相当简单,就像这样:
for (int i=0; i<enemies.size(); i++)
enemies[i]->doStuff();
关于c++ - 界面的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809047/