如果我有一些东西的各种子类,以及一个对这些子类的实例进行操作的算法,并且如果算法的行为根据实例的特定子类而略有不同,那么最常见的面向对象的方法这是使用虚拟方法。
例如,如果子类是 DOM 节点,如果算法是插入一个子节点,则该算法会有所不同,具体取决于父节点是 DOM 元素(可以有子节点)还是 DOM 文本(不能有子节点) ): 因此 insertChildren
方法在 DomNode
基类中可能是虚拟的(或抽象的),并且在每个 DomElement
和DomText
子类。
另一种可能性是为实例提供一个公共(public)属性,其值可以被读取:例如,算法可能读取 DomNode
基类的 nodeType
属性;或者再举一个例子,你可能有不同类型(子类)的网络数据包,它们共享一个公共(public)的数据包头,你可以通过读取数据包头来查看它是什么类型的数据包。
我没有太多使用运行时类型的信息,包括:
- C#中的
is
和as
关键字 - 沮丧
- .net中的Object.GetType方法
- C++中的
typeid
运算符
当我添加一个依赖于子类类型的新算法时,我倾向于向类层次结构中添加一个新的虚方法。
我的问题是,什么时候使用运行时类型的信息而不是虚函数是合适的?
最佳答案
当别无他法时。虚拟方法总是首选,但有时它们就是不能使用。发生这种情况的原因有很多,但最常见的原因是您没有要使用的类的源代码,或者您无法更改它们。当您使用遗留系统或闭源商业库时,经常会发生这种情况。
在 .NET 中,您可能还必须动态加载新程序集,例如插件,并且您通常没有基类,但必须使用鸭子类型之类的东西。
关于c# - 何时使用运行时类型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1520466/