type 与 RTTI

时常,我们在程序中经常出现这样的switch或者if-else分支: if (pobj->IsKindOf(Circle)) else if (pobj->IsKindOf(Rectangle)) 等。其中上面的IsKindOf也可能是我们自定义的GetType(),或者是C++标准中的dynamic_cast。 不管怎么样,这是十分不好的设计/风格。 原因很简单,要添加一个新的类型,所有这些条件判断的地方都需要做更改;反之,使用多态只需要添加一个SubClass(当然,也可以在类层次上作一些调整)。 因此,MFC的CObject::IsKindOf() 明确的指出Do not use this function extensively because it defeats the C++ polymorphism feature. Use virtual functions instead. 如何应对这个问题呢, MartinFlower在《重构》中明确的指出了几条细则,包括: Replace Type Code with Class; Replace Type Code with State/Strategy; Replace Type Code with Subclasses; Replace Conditional with Polymorphism 既然如此,为什么还需要IsKindOf,dynamic_cast这些玩意呢。 在BS的《C++语言的设计与演化》中的《强制》一章“为什么提供一种危险‘特征’”一节中,我们可以找到讲RTTI作为标准的一些理由。这里就不一一罗列。 (“危险”两个词用的好,o(∩_∩)o) 每一个有用的特征都可以被误用。。。