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