天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

C#中的接口

本文中所有圖示純為個人理解(參考了Assembly中元數據的存儲方式),與真實情況可能有所出入。 圖中綠色表示公有方法,紅色表示私有方法。

本文將通過以下四個案例來分析C#中的接口究竟是如何工作的。

1、公有方法實現接口方法

盡管C#在定義接口時不用指明接口方法的訪問控制方式,但默認接口方法均為public型(這可以從反編譯的IL代碼中看到)。下面是使用Reflector查看的接口IL代碼

.class private interface abstract auto ansi IControl{   .method public hidebysig newslot abstract virtual instance void Paint() cil managed   {   }}

實現接口的類需要實現所有接口方法。通常情況下,接口的實現方法也為public型。如下案例:

using System ;interface IControl {   void Paint();}public class EditBox: IControl {   public void Paint()    {      Console.WriteLine("Pain method is called!");   }}class Test {   static void Main()    {      EditBox editbox = new EditBox();       editbox.Paint();      ((IControl)editbox).Paint();   }}

程序的執行結果為:

Pain method is called!Pain method is called!

接口就好像是關系型數據庫中的一對多表,一個接口對應多個接口方法,每個接口方法又對應虛擬方法表(VMT)中的某個公有或私有方法。上面代碼在內存中的鏡像可由下圖描述:

從圖中我們可以看到直接對Paint方法的調用以及通過接口對Paint方法的調用??梢娡ㄟ^接口對方法進行調用需要多出一道轉換工作,因此執行效率不如直接調用。

2、私有方法不能實現接口方法

如果想將接口方法直接實現為私有方法是辦不到的。下面的EditBox的代碼中Paint方法沒有特殊說明,默認為private,導致代碼無法執行:

using System ;interface IControl {   void Paint();}public class EditBox: IControl {   void Paint()    {      Console.WriteLine("Pain method is called!");   }   public void ShowPaint()   {      this.Paint();      ((IControl)this).Paint();   }}class Test {   static void Main()    {      EditBox editbox = new EditBox();       editbox.ShowPaint();   }}

程序在編譯時將顯示如下編譯錯誤:““EditBox”不會實現接口成員“IControl.Paint()”。“EditBox.Paint()”或者是靜態、非公共的,或者有錯誤的返回類型。”

為什么會這樣呢?如圖:

這是由于接口規范中的方法默認的訪問權限是public,而類中的默認訪問權限是default,也就是說private,因此導致權限范圍收縮,兩者權限并不相同,所以必須將類的權限調整為public才可以使上面的代碼得以執行。

3、實現專門的接口方法(1)

代碼如下:

using System ;interface IControl {   void Paint();}public class EditBox: IControl {   void Paint()    {      Console.WriteLine("Pain method is called!");   }   void IControl.Paint()    {      Console.WriteLine("IControl.Pain method is called!");   }   public void ShowPaint()   {      this.Paint();      ((IControl)this).Paint();   }}class Test {   static void Main()    {      EditBox editbox = new EditBox();       editbox.ShowPaint();      //editbox.Paint();      ((IControl)editbox).Paint();   }}

EditBox類擁有一私有Paint方法,但這并不是接口方法的實現(上例已經分析過)。EditBox類中還包含了一“void IControl.Paint()”方法, 是該方法復寫了接口的Paint方法,該方法是私有的(通過IL代碼可以看出)。

注意:“void IControl.Paint()”前不能加任何的修飾限定符號,諸如public、private等,這在C#的語法中是不允許的。該方法反編譯得到的IL代碼如下:

.class public auto ansi beforefieldinit EditBox      extends object      implements IControl{      .......      .method private hidebysig newslot virtual final instance void IControl.Paint() cil managed      {            .override IControl::Paint      }}

程序運行時內存中的鏡像可簡化表示為:

程序執行結果如下:

Pain method is called!IControl.Pain method is called!IControl.Pain method is called!

我們之所以可以通過((IControl)editbox).Paint()方法訪問到代碼是因為接口方法Paint是公有的。但是我們不能通過editbox.Paint()方法訪問到代碼是因為EditBox的Paint方法是私有的。 在EditBox內部,通過ShowPaint方法可以同時訪問私有的Paint方法與接口IControl.Paint方法。

4、實現專門的接口方法(2)

如果EditBox中的Pait方法為公有并且同時提供了IControl.Paint方法,程序將是如何運行的呢?代碼如下:

using System ;interface IControl {   void Paint();}public class EditBox: IControl {   public void Paint()    {      Console.WriteLine("Pain method is called!");   }   void IControl.Paint()    {      Console.WriteLine("IControl.Pain method is called!");   }}class Test {   static void Main()    {      EditBox editbox = new EditBox();       editbox.Paint();      ((IControl)editbox).Paint();   }}

程序執行結果如下:

Pain method is called!IControl.Pain method is called!

程序執行時內存布局如下:

可見,EditBox中公有的Paint方法并不是接口實現方法,真正的接口實現方法是IControl.Paint,這將導致editbox.Paint()方法與((IControl)editbox).Paint()的執行結果并不一樣。

5、結論

接口方法的實現通常是通過類中的公有方法實現的;

在一些特殊情況下(代碼隱藏、一個類實現的兩個接口具有相同的接口方法等),需要專門實現某個接口的方法。

NET技術C#中的接口,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 涩涩伊人久久无码欧美 | 高h乱一受多攻男男 | 成人免费观看www视频 | 国产品无码一区二区三区在线 | 午夜小视频免费观看 | 爱穿丝袜的麻麻3d漫画免费 | 久久精品亚洲热综合一本 | 玩弄人妻少妇500系列网址 | 亚洲AV永久无码精品澳门 | 老师你奶真大下面水真多 | 男的插曲女的下面免费APP | 亚洲 日韩 色 图网站 | 麻豆蜜桃国语精品无码视频 | 快播h网站 | 日本久久黄色 | 男女性杂交内射妇女BBWXZ | 乱叫抽搐流白浆免费视频 | 国产成人精品久久久久婷婷 | bl 纯肉 高Hbl被强文 | 天美传媒麻豆精品 | 91久久综合精品国产丝袜长腿 | 日韩亚洲中文欧美在线 | 门鱼电影完整版免费版 | 在线观看亚洲AV无码每日更新 | 欧美日韩在线成人看片a | 囯产免费久久久久久国产免费 | 国产高清精品国语特黄A片 国产高清国内精品福利色噜噜 | 日韩在线 无码 精品 | 国产香蕉九九久久精品免费 | 99久久综合精品免费 | 亚洲成人黄色片 | 一级做a爰片久久毛片免费 一级做a爰片久久毛片潮喷动漫 | 又黄又爽又无遮挡在线观看免费 | 色欲AV精品人妻一二三区 | 国产在线精品亚洲视频在线 | 嫩草欧美曰韩国产大片 | 偷拍国产精品在线播放 | 中文国产成人精品久久免费 | 久久成人无码国产免费播放 | 国产小视频国产精品 | 久久久黄色大片 |