我知道这些问题已经存在很多问题,但我仍然不明白。举个例子:
class Projectile
{
public:
virtual void OnCollision(Projectile& other);
private:
Vector position;
Vector velocity;
};
class Bullet : Projectile
{
// We may want to execute different code based on the type of projectile
// "other" is.
void OnCollision(Projectile& other) override;
};
class Rocket : Projectile
{
// If other is a bullet, we might want the rocket to survive the collision,
// otherwise if it's a rocket, we may want both to explode.
void OnCollision(Projectile& other) override;
};
我不明白如何在没有dynamic_cast的情况下完成此示例。我们不能仅仅依赖于多态接口,因为在这种情况下,它只会向我们提供有关一个对象的信息。有没有办法可以在没有dynamic_cast的情况下完成?
另外,为什么动态演员在C#中被认为是不好的做法?他们一直在事件处理程序和非通用容器中使用。 C#中可以做的很多事情都依赖于强制转换。
答案 0 :(得分:4)
在这个具体的例子中,我会添加一个受保护的方法:
protected:
virtual int getKickassNess() = 0;
// Bullet:
int getKickassNess() override { return 10; }
// Rocket:
int getKickassNess() override { return 9001; } // over 9000!
void Bullet::OnCollision(Projectile& other)
{
if (other.getKickassNess() > this->getKickassNess())
// wimp out and die
}
IMO Bullet和Rocket不应该知道彼此存在。放入这些知情关系往往会让事情变得困难,在这种特殊情况下,我可以想象它会导致混乱的循环包含问题。