|
|
1
149
对于接口,添加
在CIL中,方法被标记为
(注意,Java允许声明接口成员
对于实现类,有一些选项:
不可重写
:在C#中,类不会将方法声明为
可覆盖的
:在C#和CIL中,方法都是
[C#]
[CIL公司]
[VB.NET版]
[CIL公司]
如果
每一个 接口方法实现必须支持多态行为,因此必须在CIL上标记为virtual,即使编译器必须通过一些限制才能做到这一点。 |
|
|
2
74
引用杰弗里里彻从CLR通过CSharp第三版这里
|
|
3
13
在我最初的回答中,我所低估的是 属性。它防止派生类重写虚方法。派生类必须重新实现接口、实现方法 阴影 基类方法。这足以实现C语言契约,即实现方法不是虚拟的。 最终的 属性正在删除。现在允许派生类重写它。 |
|
|
4
4
不过,在.NET中,接口并不是作为每个类的不同vtable实现的。接口方法通过一个全局接口方法表进行索引,所有接口都是该表的一部分。因此,不必为了实现接口方法而声明虚方法-全局接口方法表可以直接指向类方法的代码地址。 为了实现接口而声明虚方法在其他语言中也不是必需的,即使在非CLR平台中也是如此。Win32上的Delphi语言就是一个例子。 |
|
|
5
0
它们不会覆盖任何东西-接口中没有实现。
然后由类在契约的范围内实现接口方法—虚拟的或“非虚拟的”(事实证明是密封的虚拟的)。 |
|
|
6
0
接口是一个比类更抽象的概念,当您声明一个实现接口的类时,您只需说“类必须具有接口中的这些特定方法,而不管是什么方法” 事实上的 非虚拟的 , ,只要它具有相同的ID和相同的类型参数”。 其他支持接口的语言如Object Pascal(“Delphi”)和Objective-C(Mac)也不需要将接口方法标记为virtual和not virtual。 限制 我理解你的问题,因为我在Java中看到类似的东西,当一个类方法必须使用“@virtual”或“@override”来确保一个方法是虚拟的。 |