我一直在研究Roguelike,并遇到了问题。我的问题是我想使用“多态重载”或排序,但我猜C ++不支持。
我的班级图是这样的:
xMapObject< - xEntity< - xVehicle
问题是,可以这样做:
class xMapObject
{
public:
virtual void Bump(xMapObject *MapObject);
virtual void Bump(xEntity *Entity);
virtual void Bump(xVehicle *Vehicle);
virtual void BumpedBy(xMapObject *MapObject);
virtual void BumpedBy(xEntity *Entity);
virtual void BumpedBy(xVehicle *Vehicle);
};
这将是一个非常好的,因为它会极大地简化决定谁碰到什么的代码,但由于这不起作用,是否有另一种类似于此的面向对象的方法?或者是铸造物体的最佳选择,以确定它们是什么?
感谢您的帮助!
答案 0 :(得分:2)
确实有效。我认为,虽然你希望它能够在传递xMapObject *时能够区分它,但这根本就不会发生。
您需要双重调度机制。也许访客,但我怀疑它。请参阅Modern C ++ Design或wiki for multimethods。
答案 1 :(得分:0)
这是可能的,但这种设计对我来说似乎很尴尬。
namespace {
class xEntity;
class xVehicle;
class xMapObject {
public:
virtual void Bump(xMapObject *MapObject);
virtual void Bump(xEntity *Entity);
virtual void Bump(xVehicle *Vehicle);
virtual void BumpedBy(xMapObject *MapObject);
virtual void BumpedBy(xEntity *Entity);
virtual void BumpedBy(xVehicle *Vehicle);
};
class xEntity : public xMapObject {};
class xVehicle : public xMapObject {};
}
我想我会做这样的事情:
namespace {
class xMapObject {
public:
virtual void Bump(xMapObject *MapObject);
virtual void BumpedBy(xMapObject *MapObject);
};
class xEntity : public xMapObject {
public:
void Bump(xMapObject *MapObject);
void BumpedBy(xMapObject *MapObject);
};
class xVehicle : public xMapObject {
public:
void Bump(xMapObject *MapObject);
void BumpedBy(xMapObject *MapObject);
};
}