c# - 何时使用运行时类型信息?

标签 c# c++ casting oop runtime-type

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

例如,如果子类是 DOM 节点,如果算法是插入一个子节点,则该算法会有所不同,具体取决于父节点是 DOM 元素(可以有子节点)还是 DOM 文本(不能有子节点) ): 因此 insertChildren 方法在 DomNode 基类中可能是虚拟的(或抽象的),并且在每个 DomElementDomText 子类。

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

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

  • C#中的isas关键字
  • 沮丧
  • .net中的Object.GetType方法
  • C++中的typeid运算符

当我添加一个依赖于子类类型的新算法时,我倾向于向类层次结构中添加一个新的虚方法。

我的问题是,什么时候使用运行时类型的信息而不是虚函数是合适的?

最佳答案

当别无他法时。虚拟方法总是首选,但有时它们就是不能使用。发生这种情况的原因有很多,但最常见的原因是您没有要使用的类的源代码,或者您无法更改它们。当您使用遗留系统或闭源商业库时,经常会发生这种情况。

在 .NET 中,您可能还必须动态加载新程序集,例如插件,并且您通常没有基类,但必须使用鸭子类型之类的东西。

关于c# - 何时使用运行时类型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1520466/

相关文章:

c++ - 在 FreeBSD 上构建 lxml 示例时未定义对 glib 的引用

java - Java 在应用强制转换运算符后是否有可能返回对另一个变量的引用?

c++ - 如何在 unsigned int 和 int 之间安全地进行 static_cast?

c# - Foreach 循环和带锁定的变量

python - 将 openCV python 函数转换为 C++

c# - 找不到方法 : 'System.Object Newtonsoft.Json.Linq.JToken.ToObject(System.Type)'

c++ - 搜索 Active Sound 时断言失败错误

类型转换功能

c# - 使用集合初始化程序初始化 WebControl 对象的 Attributes 属性

c# - 根据条件将 WHERE 附加到查询