日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

接口映射的实现及原理

發(fā)布時(shí)間:2024/4/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接口映射的实现及原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們先看看 該代碼的類(lèi)圖的層次結(jié)構(gòu)吧


可以看出,每一個(gè)“方法()”,實(shí)際上都是不同的。
在“有接口的繼承”中,接口將“Test.接口.方法()”進(jìn)行了重新映射。這個(gè)映射是如何完成的呢?

看看如下的IL代碼:
在采取使用它們自己的類(lèi)作為訪問(wèn)入口時(shí),代碼實(shí)現(xiàn)如下:


沒(méi)有接口的繼承,它實(shí)現(xiàn)的方式如下:

void 方法() {1L_0000: ldstr L_0005: call void [mscorlib]System.Console::WriteLine(string)L_000a: ret }


而有接口的繼承,實(shí)現(xiàn)方式是這樣的:
void Test.接口.方法() {Test.接口::方法1L_0000: ldstr L_0005: call void [mscorlib]System.Console::WriteLine(string)L_000a: ret }


在這里可以看出,有接口的繼承實(shí)際上對(duì)“方法”進(jìn)行override,但這個(gè)override是覆蓋的接口的方法的實(shí)現(xiàn)成員,并非是類(lèi)的方法成員。

然后,我們繼續(xù)看看在客戶類(lèi)中對(duì)兩者進(jìn)行調(diào)用的IL

沒(méi)有接口繼承的IL
????? L_001d: newobj instance void Test.沒(méi)有接口的繼承::.ctor() //創(chuàng)建實(shí)例
????? L_0022: stloc.2
????? L_0023: ldloc.2?
????? L_0024: callvirt instance void Test.沒(méi)有接口的繼承::方法()
有接口繼承的IL
????? L_003a: newobj instance void Test.有接口的繼承::.ctor() //創(chuàng)建實(shí)例
????? L_003f: stloc.s 有接口的繼承1
????? L_0041: ldloc.s 有接口的繼承1
????? L_0043: callvirt instance void Test.基類(lèi)::方法()

如果是采取接口訪問(wèn)時(shí),則狀況如下:

沒(méi)有接口繼承的IL
????? L_0029: newobj instance void Test.沒(méi)有接口的繼承::.ctor()
????? L_002e: stloc.3
????? L_002f: ldloc.3??
????? L_0030: callvirt instance void Test.接口::方法()

有接口繼承的IL
????? L_0048: newobj instance void Test.有接口的繼承::.ctor()
????? L_004d: stloc.s 接口3
????? L_004f: ldloc.s 接口3
????? L_0051: callvirt instance void Test.接口::方法()
----------------------------------------------------------------------------
?????? 注意一下上面標(biāo)記顏色的部分,可以看出,采用不同的訪問(wèn)方式,實(shí)現(xiàn)的結(jié)果并不盡相同。也就是說(shuō),針對(duì)接口實(shí)現(xiàn)了的方法,與類(lèi)本身自帶的實(shí)現(xiàn),是兩回事,這種情況很類(lèi)似于采用new關(guān)鍵字進(jìn)行創(chuàng)建一個(gè)新的同名成員方法時(shí)遭遇的問(wèn)題。
????? 結(jié)果之所以會(huì)不同,是由于訪問(wèn)的方式不同的原因,如果采用“基類(lèi)”來(lái)訪問(wèn),很明顯,這里獲得的就是基類(lèi)的成員實(shí)現(xiàn)。也就是說(shuō),這也是多態(tài)的一種體現(xiàn),但并非不可預(yù)知或不可控制的。

  看見(jiàn)有人說(shuō)VB很難實(shí)現(xiàn)接口的映射,實(shí)際上并不是這樣,要解釋一下這個(gè)問(wèn)題,這里不得不說(shuō)一下,強(qiáng)類(lèi)型的C#語(yǔ)法的含義。
????? “基類(lèi)?objBase = new?基類(lèi)();” 這種語(yǔ)法,表示的是使用“基類(lèi)”來(lái)訪問(wèn)新建的“基類(lèi)”的實(shí)例,換而言之,“基類(lèi) objDevired = new?沒(méi)有接口的繼承();”表示的就是使用基類(lèi)來(lái)訪問(wèn)新建的“沒(méi)有接口的繼承”的實(shí)例。
  接口的訪問(wèn),也是如此,在原理上,將接口看作是一個(gè)十分特殊的抽象類(lèi),它與一般的抽象類(lèi)的區(qū)別在于強(qiáng)制了成員的實(shí)現(xiàn)(接口的語(yǔ)法由編譯器來(lái)驗(yàn)證的,在CLR并未提供限制性機(jī)制),所以,在有一些設(shè)計(jì)模式中,也可以看到采用了接口-抽象類(lèi)-具體類(lèi)的方式來(lái)繞開(kāi)這類(lèi)強(qiáng)制成員實(shí)現(xiàn)的檢查,從而提高靈活性。
????? 所以,VB.NET照樣也可以完成接口映射,因?yàn)榻涌诒旧淼膶?shí)現(xiàn)機(jī)制仍舊是依賴于類(lèi)的基本特征的。

????? 示例偽代碼如下:?????

Friend?Interface?接口Interface?接口
??????
'?Methods
??????Sub?方法()Sub?方法()
End?Interface


Friend?Class?基類(lèi)Class?基類(lèi)
??????
Implements?接口

??????
Public?Sub?New()Sub?New()
??????
Private?Sub?Test()Sub?Test.接口.方法()?Implements?接口.方法
??????
Public?Sub?方法()Sub?方法()
End?Class


Friend?Class?沒(méi)有接口的繼承Class?沒(méi)有接口的繼承
??????
Inherits?基類(lèi)

??????
Public?Sub?New()Sub?New()
??????
Public?Sub?方法()Sub?方法()
End?Class


?
Friend?Class?有接口的繼承Class?有接口的繼承
??????
Inherits?基類(lèi)
??????
Implements?接口

??????
Public?Sub?New()Sub?New()
??????
Private?Sub?Test()Sub?Test.接口.方法()?Implements?接口.方法
End?Class



  但就接口本身來(lái)說(shuō),是一個(gè)便利性的工具,在編程時(shí)的認(rèn)識(shí)上,我們不應(yīng)該將它與類(lèi)視作“同一類(lèi)東西”,它是對(duì)類(lèi)的之間關(guān)系的一個(gè)描述。對(duì)于類(lèi)本身的機(jī)制來(lái)說(shuō),繼承與多態(tài)都是提供父子關(guān)系的縱向關(guān)系描述,而橫向的關(guān)系描述,則反映得并不是很好,接口通過(guò)一定的實(shí)現(xiàn)機(jī)制,則部分性地彌補(bǔ)了這個(gè)空缺。
  像代碼中所描述那樣,接口僅是作為一個(gè)便利性的工具存在,在面向接口的編程中,提供一切都圍繞接口而進(jìn)行,所以,在此類(lèi)的編程模式下,可以采用接口為替換一個(gè)方法實(shí)現(xiàn)提供十分理想的方式,雖然這比起濫用繼承并沒(méi)有什么優(yōu)勢(shì),但它是一個(gè)思想與觀念上的轉(zhuǎn)變,從本質(zhì)上來(lái)說(shuō),接口映射與繼承中的new一樣,作為技巧用用可以,但它本身并不是一個(gè)值得推薦的方式。

總結(jié)

以上是生活随笔為你收集整理的接口映射的实现及原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。