我试图找出为什么一些代码库使用IsA()来确定对象多态性,如果在C++中你已经可以安全地进行上传和下调(使用dynamic_cast)?
到目前为止,我认为唯一有用的案例是当你整合一个链接到c ++代码库的脚本环境时?
谢谢!
在C++中IsA(),几乎没有什么理由可以使用,甚至dynamic_cast<>()是需要的功能.这类代码的最糟糕的例子是dynamic_cast在type字段上使用s或switch语句的巨大if-then语句.这些代表了维护的噩梦,添加类可能涉及更新数十个或数百个不同的位置以支持新类.
例如:
坏:
// 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";
}
Run Code Online (Sandbox Code Playgroud)
更好:
void PrintName(Base *b, ostream &o)
{
o << b->GetName();
}
Run Code Online (Sandbox Code Playgroud)
这显然是在检查null,并使用智能指针等.同样,如果您要查询类型以在不同行为之间进行选择,您需要询问为什么要为每种类型执行不同的操作,并移动该行为决定进入对象.
坏:
// 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
}
}
Run Code Online (Sandbox Code Playgroud)
更好:
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; }
Run Code Online (Sandbox Code Playgroud)
在现代C++中没有任何意义.
在1998年标准化之前的框架可以提供IsA功能.
例如,我记得在MFC中有这样的功能.
另外,正如您所指出的,当处理用其他语言实现的对象(类型不是由C++类型表示)时,它可能是有用的.
干杯&hth.,