2008年7月12日 星期六

VB當中的新語法(三) - 擴充方法

在VB的幾個新語法當中,擴充方法也是很有趣的功能之一,某種角度來說,它讓我在上課時幾乎已經要丟一在一邊的Module關鍵字又重新開啟了另一個重生的機會。

簡單的說,擴充方法就是以額外的程式碼替原有的Class(不管你有沒有這個Class的原始程式碼,不管是原本系統的Class或是你自己寫的)增加新的Method。

作法是開啟一個新的Module檔案,並在當中建立一個Method,例如:
Module IntergerExtensions
  <System.Runtime.CompilerServices.Extension()>Public Sub Show(ByVal para As Integer)
    MsgBox(para)
  End Sub
End Module


請注意,一定要宣告在Module當中,並且加上<System.Runtime.CompilerServices.Extension()>特徵關鍵字 。由於這個函式的參數是Integer,如此一來,就會自動幫原有的Integer類別增加了一個Show方法,因此你在撰寫主程式的時候,會發現只要用到integer的變數,打個點,就可以自動帶出Show方法:


當然,並不是Integer就真的有這個新的Method,更不是繼承的觀念,純粹只是Compiler和IDE進行某種程度的 "混淆視聽" 之後的結果。IDE負責讓你在開發的時候有intellisense可以用,Compiler則負責去解讀這種特殊的語法轉換成一般呼叫函式的程式碼。

使用的方法就是那麼簡單,即可讓原有的Class增加新的功能,別忘了,使用前要在主程式中Import這個Module。例如:
Imports WindowsApplication1.IntergerExtensions
(由於我的程式的root Namespace是WindowsApplication1,而Module Name是IntergerExtensions,因此我會這樣寫)

說真的,這個功能我覺得放在Module當中還蠻有點道理的,因為擴充方法其實是Public Shared 型別,且實務上我們可以把一些常用的Method(Sub或Fucntion)集中在一個或數個Module當中,賦予適當的Module Name做為區分,這樣在撰寫程式的時候不需要回頭找這些Method放在哪一個NameSpace底下,然後再去呼叫它,反而可以像上圖一樣,用到Integer的時候就直接呼叫我們幫Integer撰寫的擴充方法,因為它根本已經變成(長的像而已,不是真的是)特定型別物件(例如上面例子中的Integer)的方法,所以想用的時候 "隨手" 就可以用,撰寫程式碼時,只需要在該型別的物件旁打個點,就會自動帶出符合該型別的物件可用的Method,相當好用。

如果你熟悉泛型的觀念,可以繼續往下看,底下這段程式碼很有趣:
   Public Sub Show(Of T)(ByVal para As T)
    MsgBox(para)
  End Sub

我們把原本的Integer換成了泛型寫法,透過這樣的方式,我們在使用擴充方法的時候也更加的方便了:
  Dim a As Integer = 60
  a.Show()

  Dim b As String = "test"
  b.Show()


總的來說,擴充方法的出現,讓程式設計的自由度與靈活度又提高了。

沒有留言: