在VB的幾個新語法當(dāng)中,擴(kuò)充方法也是很有趣的功能之一,某種角度來說,它讓我在上課時幾乎已經(jīng)要丟在一邊的Module關(guān)鍵詞又重新開啟了另一個重生的機(jī)會。
簡單的說,擴(kuò)充方法就是以額外的程序代碼替原有的Class(不管你有沒有這個Class的源代碼,不管是原本系統(tǒng)的Class或是你自己寫的)增加新的Method。
作法是開啟一個新的Module文件,并在當(dāng)中建立一個Method,例如:
Module IntergerExtensions
<System.Runtime.CompilerServices.Extension()>Public Sub Show(ByVal para As Integer)
MsgBox(para)
End Sub
End Module
請注意,一定要聲明在Module當(dāng)中,并且加上<System.Runtime.CompilerServices.Extension()>特征關(guān)鍵詞 。由于這個函數(shù)的參數(shù)是Integer,如此一來,就會自動幫原有的Integer類增加了一個Show方法,因此你在編寫主程序的時候,會發(fā)現(xiàn)只要用到integer的變量,打個點(diǎn),就可以自動帶出Show方法:
當(dāng)然,并不是Integer就真的有這個新的Method,更不是繼承的觀念,純粹只是Compiler和IDE進(jìn)行某種程度的 "混淆視聽" 之后的結(jié)果。IDE負(fù)責(zé)讓你在開發(fā)的時候有intellisense可以用,Compiler則負(fù)責(zé)去解讀這種特殊的語法轉(zhuǎn)換成一般呼叫函數(shù)的程序代碼。
使用的方法就是那么簡單,即可讓原有的Class增加新的功能,別忘了,使用前要在主程序中Import這個Module。例如:
Imports WindowsApplication1.IntergerExtensions
(由于我的程序的root Namespace是WindowsApplication1,而Module Name是IntergerExtensions,因此我會這樣寫)
說真的,這個功能我覺得放在Module當(dāng)中還蠻有點(diǎn)道理的,因?yàn)閿U(kuò)充方法其實(shí)是Public Shared 類型,且實(shí)務(wù)上我們可以把一些常用的Method(Sub或Fucntion)集中在一個或數(shù)個Module當(dāng)中,賦予適當(dāng)?shù)腗odule Name做為區(qū)分,這樣在編寫程序的時候不需要回頭找這些Method放在哪一個NameSpace底下,然后再去調(diào)用它,反而可以像上圖一樣,用到Integer的時候就直接調(diào)用我們幫Integer編寫的擴(kuò)充方法,因?yàn)樗疽呀?jīng)變成(長的像而已,不是真的是)特定類型對象(例如上面例子中的Integer)的方法,所以想用的時候 "隨手" 就可以用,撰寫程序代碼時,只需要在該類型的對象旁打個點(diǎn),就會自動帶出符合該類型的對象可用的Method,相當(dāng)好用。
如果你熟悉泛型的觀念,考試大和大家一起繼續(xù)往下看,底下這段程序代碼很有趣:
Public Sub Show(Of T)(ByVal para As T)
MsgBox(para)
End Sub
我們把原本的Integer換成了泛型寫法,通過這樣的方式,我們在使用擴(kuò)充方法的時候也更加的方便了:
Dim a As Integer = 60
a.Show()
Dim b As String = "test"
b.Show()
總的來說,擴(kuò)充方法的出現(xiàn),讓程序設(shè)計(jì)的自由度與靈活度又提高了。
簡單的說,擴(kuò)充方法就是以額外的程序代碼替原有的Class(不管你有沒有這個Class的源代碼,不管是原本系統(tǒng)的Class或是你自己寫的)增加新的Method。
作法是開啟一個新的Module文件,并在當(dāng)中建立一個Method,例如:
Module IntergerExtensions
<System.Runtime.CompilerServices.Extension()>Public Sub Show(ByVal para As Integer)
MsgBox(para)
End Sub
End Module
請注意,一定要聲明在Module當(dāng)中,并且加上<System.Runtime.CompilerServices.Extension()>特征關(guān)鍵詞 。由于這個函數(shù)的參數(shù)是Integer,如此一來,就會自動幫原有的Integer類增加了一個Show方法,因此你在編寫主程序的時候,會發(fā)現(xiàn)只要用到integer的變量,打個點(diǎn),就可以自動帶出Show方法:
當(dāng)然,并不是Integer就真的有這個新的Method,更不是繼承的觀念,純粹只是Compiler和IDE進(jìn)行某種程度的 "混淆視聽" 之后的結(jié)果。IDE負(fù)責(zé)讓你在開發(fā)的時候有intellisense可以用,Compiler則負(fù)責(zé)去解讀這種特殊的語法轉(zhuǎn)換成一般呼叫函數(shù)的程序代碼。
使用的方法就是那么簡單,即可讓原有的Class增加新的功能,別忘了,使用前要在主程序中Import這個Module。例如:
Imports WindowsApplication1.IntergerExtensions
(由于我的程序的root Namespace是WindowsApplication1,而Module Name是IntergerExtensions,因此我會這樣寫)
說真的,這個功能我覺得放在Module當(dāng)中還蠻有點(diǎn)道理的,因?yàn)閿U(kuò)充方法其實(shí)是Public Shared 類型,且實(shí)務(wù)上我們可以把一些常用的Method(Sub或Fucntion)集中在一個或數(shù)個Module當(dāng)中,賦予適當(dāng)?shù)腗odule Name做為區(qū)分,這樣在編寫程序的時候不需要回頭找這些Method放在哪一個NameSpace底下,然后再去調(diào)用它,反而可以像上圖一樣,用到Integer的時候就直接調(diào)用我們幫Integer編寫的擴(kuò)充方法,因?yàn)樗疽呀?jīng)變成(長的像而已,不是真的是)特定類型對象(例如上面例子中的Integer)的方法,所以想用的時候 "隨手" 就可以用,撰寫程序代碼時,只需要在該類型的對象旁打個點(diǎn),就會自動帶出符合該類型的對象可用的Method,相當(dāng)好用。
如果你熟悉泛型的觀念,考試大和大家一起繼續(xù)往下看,底下這段程序代碼很有趣:
Public Sub Show(Of T)(ByVal para As T)
MsgBox(para)
End Sub
我們把原本的Integer換成了泛型寫法,通過這樣的方式,我們在使用擴(kuò)充方法的時候也更加的方便了:
Dim a As Integer = 60
a.Show()
Dim b As String = "test"
b.Show()
總的來說,擴(kuò)充方法的出現(xiàn),讓程序設(shè)計(jì)的自由度與靈活度又提高了。