栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么C#接口方法没有声明为抽象或虚拟的?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么C#接口方法没有声明为抽象或虚拟的?

对于该接口,添加

abstract
甚至
public
关键字是多余的,因此您可以省略它们:

interface MyInterface {  void Method();}

在CIL中,该方法被标记为

virtual
abstract

(请注意,Java允许声明接口成员

public abstract
)。

对于实现类,有一些选项:

不可覆盖
:在C#中,类未将方法声明为

virtual
。这意味着它不能在派生类中被覆盖(只能是隐藏的)。在CIL中,该方法仍然是虚拟的(但是封闭的),因为它必须支持有关接口类型的多态性。

class MyClass : MyInterface {  public void Method() {}}

可重写 :在C#和CIL中,方法均为

virtual
。它参与多态调度,可以被覆盖。

class MyClass : MyInterface {  public virtual void Method() {}}

显式的
:这是类实现接口的一种方法,但不提供类本身的公共接口中的接口方法。在CIL中,该方法将是

private
(!),但仍然可以从类外部通过对相应接口类型的引用进行调用。显式实现也是不可覆盖的。这是可能的,因为有一个CIL指令(
.override
)将私有方法链接到它正在实现的相应接口方法。

[C#]

class MyClass : MyInterface {  void MyInterface.Method() {}}

[CIL]

.method private hidebysig newslot virtual final instance void MyInterface.Method() cil managed{  .override MyInterface::Method}

在VB.NET中,您甚至可以在实现类中为接口方法名称加上别名。

[VB.NET]

Public Class MyClass  Implements MyInterface  Public Sub AliasedMethod() Implements MyInterface.Method  End SubEnd Class

[CIL]

.method public newslot virtual final instance void AliasedMethod() cil managed{  .override MyInterface::Method}

现在,考虑这种奇怪的情况:

interface MyInterface {  void Method();}class base {  public void Method();}class Derived : base, MyInterface { }

如果

base
Derived
在同一程序集中声明,则编译器将
base::Method
虚拟化并密封化(在CIL中),即使
base
未实现该接口也是如此。

如果

base
Derived
在不同的程序集中,则在编译该
Derived
程序集时,编译器不会更改其他程序集,因此它将引入一个成员,
Derived
该成员将是一个显式实现
MyInterface::Method
,将其委托给
base::Method

因此,您将看到, 每个 接口方法实现都必须支持多态行为,因此即使编译器必须经过箍才能实现,也必须在CIL上将其标记为虚拟。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433013.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号