程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> VB.NET之旅(八)—接口

VB.NET之旅(八)—接口

編輯:VB.NET

“還有兩種繼承方法?”我是真正被VB.NET的強大功能所折服了。 求知的渴望驅使著我向大李露出了一個最燦爛的笑容,“行了,別傻笑了, 我告訴你不就成了。”大李不禁也笑了起來。

“剛才我說到 ‘脆弱的基類’時,就提到實現繼承最大的問題,就在於基類與派生 類之間的關系過於緊密,還記得吧?基類實現細節往往會洩露出來,這不是我們 願意看到的封裝情況,所以有很多程序設計師就想盡方法來改進這一問題,其中 最出名的,就是COM了。”

“COM?我在VB6中經常用呀,是一 種組件形式呀。”我不是太明白大李的話,這和面向對象的繼承有什麼關系 ?

“你說的不錯,正是通過組件的這種封裝方式,我們就可以把實 現繼承局限於在組件內部使用,而我們使用組件時,就不用理會它內部是什麼, 怎麼實現的。這就可以避免不可預測地對基類的修改。我們把利用組件的組織程 序方法稱為面向組件程序設計,但這也是一種面向對象的設計方法,不過是更具 強制性。組件支持組件內部的實現繼承,還支持接口繼承。 ”

“接口繼承,我不是太清楚。不過,接口我是清楚的,就是 組件開放的屬性、方法與事件、公用變量的定義方法。我在VB6中也接觸過接口編 程,不是太方便,好象要把定義了方法卻沒有寫實現過程的類編譯成DLL文件, VB6會自動將它創建為接口,不過只能是隱藏的,不是顯式定義的。”我回 憶了一下說。

大李微微點了點頭說:“從面向對象的觀點來看,接 口就是對象的外觀,而對象實際的工作方式就是實現。把接口與實現分離開就是 我們要進行封裝的動機。用戶只能通過接口來操作,但是看不到具體的實現的代 碼。”

大李頓了一頓,然後接著說:“VB.NET 以前的 Visual Basic 版本可以使用接口,但不能直接創建它們。VB.NET 卻是允許可以用 Interface 語句定義真正的接口的喔!”

此言一出,真讓我大吃一 驚。“我們也可以直接定義接口嗎?”

“當然,” 大李說,“在VB.NET中,和類一樣,接口也可以定義屬性、方法和事件。但 正如我剛才說到的,與類不同的是,接口並不提供實現。現在的接口,是由類來 實現的,並從類中被定義為單獨的實體。”

大李手指在桌面上重重 的敲了一下,加強了一下語氣:“我們可以這樣來理解,接口表示的是一種 約定。實現接口的類必須嚴格按其定義來實現接口的每個方面。有了接口,就可 以將功能定義為一些緊密相關成員的小組。可以在不危害現有代碼的情況下,開 發接口的增強型實現,從而使兼容性問題最小化。也可以在任何時候通過開發附 加接口和實現來添加新的功能。雖然接口實現可以進化,但接口本身一旦被發布 就不能再更改。對已發布的接口進行更改會破壞現有的代碼。若把接口視為約定 ,很明顯約定雙方都各有其承擔的義務。接口的發布者同意不再更改該接口,接 口的實現者則同意嚴格按設計來實現接口。”

“也就是說,在 VB.NET中,接口是用類來實現的,就象是個抽象類,只是關鍵字用的是Interface ,不是class,對嗎?”我還是很好奇。

“接口的實現可以是 類,也可以是結構。接口的定義用的是Interface關鍵字,實現時用的是 Implements關鍵字”大李淡淡的一句話,使我在心中開始回憶起類和結構的 差別來(詳見前文《類和結構》)。

大李接著跟我解說:“接口的 成員包括其成員聲明引入的成員和從其基接口繼承的成員。只有嵌套類型、方法 、屬性和事件才能作為接口成員。方法和屬性不能有實體。接口成員隱式地定為 是Public,而且不能指定訪問修飾符。接口自已倒是可以添加修飾符。”大 李跟著看了我一眼,就在電腦上開始寫起示例來:

Public Interface

 IHenry 
  Sub subX(ByVal x As Integer) 
  Function fcnY(ByVal y As Integer) As Long 
  Property proZ() As String 
End Interface 
Public Class CHenry 
  Implements IHenry 
  Private z1 As String 
  Sub subX(ByVal x As Integer) Implements IHenry.subX 
    '填寫實現代碼 
  End Sub 
  Function fcnY(ByVal y As Integer) As Long Implements 

IHenry.fcnY 
    '填寫實現代碼 
  End Function 
  Property proZ() As String Implements IHenry.proZ 
    Get 
      Return z1 
    End Get 
    Set(ByVal Value As String) 
      z1 = Value 
    End Set 
  End Property 
End Class

大李指著代碼說:“你看,我用Interface定義了一個 接口IHenry(筆者注:一般來說,接口的命名第一個字母為I,這並沒有什麼強制 的含義,但卻是一個通用的命名規則),內含三個方法與屬性的定義,但並沒有 實現;實現代碼寫在 CHenry類中。你可以按我剛才說的約定的思路來理解, IHenry接口其實就是一個合約的提綱,CHenry是該合約的一個操作版本,只要在 CHenry中實現了接口IHenry定義的所有的方法,不管是怎麼實現的,有沒有加入 新的方法,都可認為CHenry是支持IHenry接口的一個實現類。 ”

“一個實現類?也就是說接口可以有多個實現喽?” 我不解地問。

“當然,我剛才說過,接口其實就是一個對象的外觀 ,在VB.NET中有很多很重要的接口,定義了很多種類型的對象,比如說你所熟悉 的Windows Form的控件,它們的基類大部分是Component類,而Component類就是 IComponent接口的一個實現類,IComponent類還有其它三個實現類,那就是: Control、HttpApplication和MarshalByValueComponent類,分別完成不同的功能 ,但它們都要實現IComponent接口所定義的方法與屬性,且參數定義與返回類型 都要與接口定義時的簽名一致。換個角度來看這個問題,我們如何創建一個組件 ,且讓系統都識別,靠的就是對接口的實現。要成為組件的類必須實現 IComponent 接口,並提供不需要參數或只需一個類型為 IContainer 的參數的基 本構造函數就行了。”

“哦,我明白了,通過接口,我們可以 定義下某種對象的基本外觀,然後可以自由地進行實現與擴展,卻不涉及對原型 的直接修改。太棒了!”我一下子高興了起來。

“是呀,在 VB.NET中可以顯式定義接口,使得接口編程也成為很棒的編程方式了。剛才所說 的,在不同的類中實現同一個接口,不就是一種用接口實現的多態性嗎?另外, 在類和結構中也可以實現多個接口。”大李寫了如下的代碼給我看:

Interface IOne 
   Sub SubOne() 
End Interface 
Interface ITwo 
   Sub SubTwo() 
End Interface 
Class CHenry 
   Implements IOne 
   Implements ITwo 
   Sub SubOne() Implements IOne.SubOne 
    '實現代碼 
   End Sub 
   Sub SubTwo() Implements ITwo.SubTwo 
    '實現代碼 
   End Sub 
End Class 

“真有意思,”我饒有興致地看著代碼, “也就是說CHenry就具備了IOne與ITwo所定義的外觀特點了。 ”

我一下子想起了抽象類的定義,不由好奇地說:“如果把接 口看成一個基類,那麼用於實現的類不就可以看成是它的一個派生類了?這是不 是就是接口繼承呀?”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved