何时使用运行时类型信息?

Chr*_*isW 5 c# c++ oop casting runtime-type

如果我有各种类的子类,以及对这些子类的实例进行操作的算法,并且如果算法的行为根据实例的特定子类略有不同,那么最常用的面向对象的方法是使用虚拟方法.

例如,如果子类是DOM节点,并且算法是要插入子节点,则该算法根据父节点是DOM元素(可以有子节点)还是DOM文本(不能)而不同:因此,该insertChildren方法可以是DomNode基类中的虚拟(或抽象),并且在每个子类DomElementDomText子类中实现不同.

另一种可能性是为实例提供一个公共属性,可以读取其值:例如,算法可能会读取基类的nodeType属性DomNode; 或者另一个例子,您可能有不同类型(子类)的网络数据包,它们共享一个公共数据包标头,您可以读取数据包标头以查看它是什么类型的数据包.

我没有太多使用运行时类型信息,包括:

  • C#中的isas关键字
  • 溯造型
  • 点网中的Object.GetType方法
  • typeidC++中的运算符

当我添加一个取决于子类类型的新算法时,我倾向于在类层次结构中添加一个新的虚方法.

我的问题是,何时使用运行时类型信息而不是虚函数?

vav*_*ava 5

当没有别的办法时.虚拟方法总是首选,但有时它们无法使用.有几个原因导致这种情况发生,但最常见的原因是您没有要使用的类的源代码,或者您无法更改它们.当您使用旧系统或使用闭源商业库时,通常会发生这种情况.

在.NET中,你可能还需要动态加载新的程序集,比如插件,你通常没有基类,但必须使用像duck typing这样的东西.

  • @ChrisW,它更难理解,执行起来慢得多.它不被弃用,它只是其他方法更好:) (2认同)
  • http://www.wilmott.com/messageview.cfm?catid=10&threadid=37956 - 这是一个很好的讨论为什么它比虚拟调度慢 (2认同)