我正在通过Common Language Infrastructure本书学习中间语言。
它指出可以用newslot
属性标记类型的虚拟方法。但是该属性确实使我感到困惑,我无法理解其含义。
这里是引号:
II.10.3-引入和覆盖虚拟方法
通过提供方法的直接实现来覆盖基本类型的虚拟方法 (使用方法定义,请参见第II.15.4节),而不是将其指定为新闻通讯簿(第II.15.4.2.3节)。现有的 方法主体还可以用于使用.override指令实现给定的虚拟声明 (§II.10.3.2)。
II.10.3.1引入虚拟方法
通过定义虚拟方法(第II.15.4节),将虚拟方法引入到继承层次结构中。的 可以将定义标记为newslot以始终为定义类和任何其他类创建新的虚拟方法 从中派生的类:
1)如果定义标记为newslot,则定义将始终创建一个新的虚拟 方法,即使基类提供了匹配的虚方法。对的参考 通过包含方法定义的类或通过派生的类来实现虚拟方法 从该类中引用新定义(除非被隐藏在新闻稿定义中 派生类)。不通过包含以下内容的类对虚拟方法的任何引用 方法定义,也未通过其派生类引用原始定义。
2)如果定义未标记为newslot,则定义将创建一个新的虚拟方法 仅当没有从名称继承的具有相同名称和签名的虚拟方法时 基类。
因此,当将虚拟方法标记为Newslot时,其引入不会影响任何现有方法 在其基类中引用匹配的虚方法。
短语“定义创建新的虚拟方法”是什么意思?我以为虚拟方法的引入总会创造出新方法。我认为新闻通讯是无用的属性。有人可以提供示例来澄清该文本吗?
答案 0 :(得分:2)
您是否熟悉C#中方法定义中的new
modifier? -同样的概念。
您说的是“此方法与我的基类现在或将来公开的任何方法都不相同”。即使我们使用了完全相同的名称。人们通过我的基类的变量调用方法X或在我的继承链的更远处从我的基类获取方法X。人们在类或从其派生的类的变量上调用方法X会得到 this 方法X(除非派生类引入了自己的newslot
X方法)
这里的关键是,在IL级别,如果有可覆盖的方法可用,则覆盖是假定的默认值:
如果该定义未标记为newslot,则仅当没有从基类继承的具有相同名称和签名的虚拟方法时,该定义才会创建新的虚拟方法。
在IL级别,您可以将替代标记为virtual
,而在C#中则不能。这就是newslot
是重要的区别功能的原因。