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

VB.NET之旅(九)—接口承繼

編輯:VB.NET

VB.NET之旅(九)—接口承繼。本站提示廣大學習愛好者:(VB.NET之旅(九)—接口承繼)文章只能為提供參考,不一定能成為您想要的結果。以下是VB.NET之旅(九)—接口承繼正文


大李拍了拍我的肩膀說:“你真有想象力,不過確實,有很多文獻把這 種用Implements來完成接口的辦法就稱為接口承繼。其實,接口自己也是可以進 行承繼的,在VB.NET中把接口間的承繼方式稱為接口承繼。”

我不 禁跟著笑了起來:“接口承繼要成為承繼,當然要用Inherits,對吧? ”

大李點搖頭說:“既然你都清楚了,那你來模仿一個下拉框 Combobox的接口吧。”

“Combobox?”我不由一愣,不 過一會就想明白了,“是不是要讓它契合有文本框供文字輸出與下拉列表供 選擇列表項的組合方式這樣的外觀?”

大李跟著提示了我一句: “接口與VB.NET中的類承繼還是有不同的,它可以支持從多個接口停止多重 承繼,VB.NET中的類只支持單一基類的承繼。”

見大李沒什麼別的 意見,我就開端寫起代碼來:

  Interface IControl
   Sub Paint()
  End Interface
  Interface ITextBox
  Inherits IControl
  ‘在文本框設置文本
   Sub SetText(ByVal text As String)
  End Interface
  Interface IListBox
  Inherits IControl
  ‘在下拉列表設置列表項
   Sub SetItems(ByVal items() As String)
  End Interface
  Interface IComboBox
   Inherits ITextBox, IListBox
  End Interface
  Class CHenry
   Implements IComboBox
   Sub SetText(ByVal text As String) Implements 

ITextBox.SetText
   '完成代碼
   End Sub
   Sub SetItems(ByVal items() As String) Implements 

IListBox.SetItems
   '完成代碼
   End Sub
  ……

寫到這,發現CHenry類中的Implements IcomboBox的ICombobox上面還有一條波浪線,闡明接口並沒有完成終了,可是我 曾經把IComboBox承繼的兩個基接口中的辦法都曾經完成了呀。把鼠標接近波浪線 一看,零碎提示“必需為接口IControl完成sub Paint()”,於是我就 持續寫:

  Sub Paint() Implements IControl.Paint
   '完成代碼
   End Sub
  End Class

我轉回頭問大李:“接口的完成類中是不是要把 接口的一切基接口都要完成一遍呀?”

大李點搖頭說:“假如 象這個演練中的狀況,當然是要把基接口中沒有完成的辦法停止完成。但也要注 意,完成接口的類或構造會隱式地完成該接口的一切基接口。假如一個接口在基 接口的可傳遞閉包中屢次呈現,它的成員只參與一次構成派生接口。完成派生接 口的類型只需完成一次屢次定義的基接口辦法。所以你也可以用Sub Paint() Implements ITextbox.Paint或是Sub Paint() Implements IListBox.Paint來代 替,但只能用這三個定義中的一個。你再來看這段代碼。”大李開端修正起 剛寫好的代碼來:

  Interface IControl
   Sub Paint()
  End Interface
  Interface ITextBox
  Inherits IControl
  ‘在文本框設置文本
  Sub SetText(ByVal text As String)
  Shadows Sub Paint()
  End Interface
  Interface IListBox
  Inherits IControl
  ‘在下拉列表設置列表項
   Sub SetItems(ByVal items() As String)
  End Interface
  Interface IComboBox
   Inherits ITextBox, IListBox
  End Interface
  Sub test(ByVal x As IComboBox)
   x.Paint()
  End Sub

“這裡的x.Paint()是哪一個接口的辦法?IControl 是ITextBox?”大李一臉笑意,真是氣人。但是,我應該可以答復下去的, 我按類的隱藏的概念回想了一下(詳見前文《重載和隱藏》),哈,明白了,它 當然是調用它直接被派生的那個基類中的辦法呀。

“是ITextBox中 的辦法吧!”

“可以呀,不錯!”大李復雜地誇了我一 句,然後喝了口水,持續說:“基接口的成員稱號在承繼分層構造的一條路 徑中被隱藏,但它在其它的途徑中不會被隱藏,比方我們可以從IlistBox中去繼 承Icontrol中的Sub Paint()。”

“可是,在您的這個示例中 的sub test裡,x是接口的實例嗎?可是,接口還沒有完成呀?”我還是有 問題要問。

“test辦法其實可以承受任何將 IComboBox 完成為小部 件參數的對象,即便對接口 IComboBox 的完成能夠相差很大。”大李答復 道。

“是不是說我們在運用的時分,可以用完成IComboBox接口的類 ,比方CHenry的一個實例去替代x?”

大李笑著說:“根本上 差不多了,你自己漸漸思索吧。還有個問題比擬有意思:完成類中用於完成接口 的辦法或屬性名倒不必與接口中定義的名字一樣,只需參數列表與前往類型分歧 就行了。比方在CHenry中的sub Paint()假如更名為sub xxx()也是可以的,只需 前面跟著Implements IControl.Paint就行了。命名一定要有規劃,不然,接口繼 承中也會帶來命名反復形成的問題,我們來看一下。”

  

Interface IHenry1
   Property yyy() As Integer
  End Interface
  Interface IHenry2
   Sub yyy(ByVal i As Integer)
  End Interface
  Interface IHenryDerived
   Inherits IHenry1
   Inherits IHenry2
  End Interface
  Sub test(ByVal x As IHenryDerived)
   x.yyy(1)
   x.yyy = 10
  End Sub

“你看,在sub test()中,無論你按IHenry2中的定 義方式來運用x.yyy(1),還是用IHenry1中的方式來運用x.yyy=10,集成編譯器都 會在它們下方打上波浪線,表示出錯,是什麼錯呢?”大李一邊問我,一邊 把鼠標接近波浪線,呈現了編譯器的出錯提示:

“yyy”在繼 承接口“IHenry1”與“IHenry2”之間不明白

“所以,我不斷強調命名規則,對吧?”大李看了我一眼, “其實處理辦法倒用不著去更改基接口中的辦法與屬性名。 ”

  Sub test()
   Dim x As IHenryDerived
   CType(x, IHenry1).yyy = 10
   CType(x, IHenry2).yyy(1)
  End Sub

“哦,用強迫類型轉換就可以了。”我又學到 一招,不由暗自竊喜。但是我心裡總是有一個不大不小的疙瘩,說來說去,這接 口與籠統類可真的太象了。趕忙得問問:“大李哥,這接口與 ……”

“籠統類?”大李一口就接了下去 :“別急,小伙子,看看幾點了,該下樓吃午飯了。”

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