我试图弄清楚为什么一些代码库使用 IsA() 来确定对象多态性,如果在 C++ 中你已经可以安全地向上转换和向下转换(使用dynamic_cast)?
到目前为止,我认为唯一有用的情况是当您集成链接到 C++ 代码库的脚本环境时?
Thanks!
原因很少,并且IsA()
函数,甚至是一个dynamic_cast<>()
C++ 中需要。此类代码最糟糕的例子是使用以下语句的巨大 if-then 语句dynamic_cast
s,或 a 上的 switch 语句type
场地。这些是维护的噩梦,添加一个类可能需要更新数十或数百个不同的位置来支持新类。
例如:
Bad:
// 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";
}
Better:
void PrintName(Base *b, ostream &o)
{
o << b->GetName();
}
这显然省略了对 null 的检查,并使用智能指针等。同样,如果您正在查询类型以在不同的行为之间进行选择,您需要询问为什么要为每种类型做不同的事情,并移动该行为决定进入对象。
Bad:
// 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
}
}
Better:
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; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)