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