如果在 C++ 中您已经可以安全地向上转型和向下转型(使用 dynamic_cast),我想弄清楚为什么一些代码库使用 IsA() 来确定对象多态性?
到目前为止,我认为唯一有用的情况是当您正在集成一个链接到 c++ 代码库的脚本环境时?
谢谢!
最佳答案
IsA()
的原因很少功能,甚至是 dynamic_cast<>()
在 C++ 中需要。此类代码最糟糕的例子是使用 dynamic_cast
的巨大 if-then 语句。 s 或 type
上的 switch 语句 field 。这些代表了维护噩梦,其中添加类可能涉及更新数十个或数百个不同位置以支持新类。
例如:
差:
// Don't do this:
void PrintName(Base *b, ostream &o)
{
if (dynamic_cast<DerivedA *>(b) != NULL)
o << "Derived A";
if (dynamic_cast<DerivedB *>(b) != NULL)
o << "Derived B";
if (dynamic_cast<DerivedC *>(b) != NULL)
o << "Derived C";
}
更好:
void PrintName(Base *b, ostream &o)
{
o << b->GetName();
}
这显然省略了空值检查和使用智能指针等。同样,如果您查询类型以在不同行为之间进行选择,则需要询问为什么要为每种类型做不同的事情,并且将该行为决定移动到对象中。
差:
// Don't do this:
void ObjectBase::ApplyForceToObject(const Force &f)
{
if (dynamic_cast<Wall*>(this) != NULL
|| dynamic_cast<Floor*>(b) != NULL)
{
// Do nothing
}
else
{
// Accelerate object
}
}
更好:
void ObjectBase::ApplyForceToObject(const Force &f)
{
if (IsFixedObject())
{
// Do nothing
}
else
{
// Accelerate object
}
}
...
bool ObjectBase::IsFixedObject() { return false; }
bool Wall::IsFixedObject() { return true; }
bool Floor::IsFixedObject() { return true; }
关于c++ - C++ 中 IsA() 的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4128113/