如果我有一些东西的各种子类,以及对这些子类的实例进行操作的算法,并且如果算法的行为根据实例的特定子类而略有不同,那么最常用的面向对象的方法是使用虚方法。
例如,如果子类是 DOM 节点,并且如果算法要插入子节点,则该算法会根据父节点是 DOM 元素(可以有子节点)还是 DOM 文本(不能)而有所不同:和因此该insertChildren
方法在基类中可能是虚拟的(或抽象的) ,并且DomNode
在每个子类中实现不同。DomElement
DomText
另一种可能性是给实例一个公共属性,其值可以被读取:例如,算法可能会读取基类的nodeType
属性;DomNode
或者另一个例子,你可能有不同类型(子类)的网络数据包,它们共享一个公共数据包头,你可以读取数据包头来查看它是什么类型的数据包。
我没有太多使用运行时类型的信息,包括:
- C#中的
is
andas
关键字 - 垂头丧气
- 点网中的 Object.GetType 方法
typeid
C++中的运算符
当我添加一个取决于子类类型的新算法时,我倾向于在类层次结构中添加一个新的虚拟方法。
我的问题是,什么时候适合使用运行时类型的信息,而不是虚函数?