我知道在这些方面已经存在很多问题,但我仍然不明白。举个例子:
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怎么可以完成此示例。我们不能仅仅依靠一个多态接口(interface),因为在这种情况下,这只会为我们提供有关一个对象的信息。有没有一种方法可以在没有dynamic_cast的情况下完成?
另外,为什么动态转换在C#中不被视为不好的做法?在整个事件处理程序和非泛型容器中,一直都在使用它们。 C#可以完成的许多工作都依赖于强制类型转换。
最佳答案
在此特定示例中,我将添加一个 protected 方法:
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不应该知道彼此存在。放入这种有关知识的关系通常会使事情变得困难,在这种特定情况下,我可以想象它会导致困惑的循环包含问题。
关于c# - 为什么dynamic_cast在C++中被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23306403/