gpt4 book ai didi

c# - 为什么 dynamic_cast 在 C++ 中被认为是不好的做法?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:50 24 4
gpt4 key购买 nike

我知道已经有很多这样的问题,但我还是不明白。举个例子:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com