VB.NET之旅(五)—類的承繼。本站提示廣大學習愛好者:(VB.NET之旅(五)—類的承繼)文章只能為提供參考,不一定能成為您想要的結果。以下是VB.NET之旅(五)—類的承繼正文
“類的承繼?”大李點搖頭,“以前很多人批判VB的功用不 完善時,都會加上這個條件。但是如今VB.NET中曾經是比擬完善的面向對象編程 辦法了。方才我們也提到過,類與 VB.NET 的構造相似,讓我們可以定義封裝一 組相關項的數據類型。但是與構造的一個重要區別就是,VB.NET 類可以承繼和擴 展其他類的特性。作為新類的根底的類稱為‘基類’。從基類派生的 類稱為‘派生類’。派生類承繼基類中定義的一切字段、屬性、辦法 和事情。你看,我們只需對類停止一次開發和調試,就可以將其作為其他類的基 礎反復運用。”
“類的承繼的概念我學過的,在VB.NET中是如 何來實踐演練呢?”我還是堅持著問。
“我寫段代碼給你看一 下吧,俗話不是說,百聞不如一見嗎?”大李調侃了兩句,噼噼啪啪地開端 敲打起鍵盤來:
Public Class CBaseHenry Private x As Integer = 10 Protected y As Integer Sub New() Console.WriteLine("基類的結構") End Sub Protected Overrides Sub Finalize() Console.WriteLine("基類的析構") MyBase.Finalize() End Sub Public Overridable Function GetY(ByVal x As Integer) As Integer Me.y = me.x + x ‘private類型的me.x只能在基類中運用 Console.WriteLine("基類的GetY辦法,後果為:" & Me.y) Return Me.y End Function Public Sub OldY() Console.WriteLine("基類的OldY辦法") End Sub End Class
“你看,這是一個基類,我再給你寫個承繼自該類的 派生類。”他一邊說一邊持續寫:
Public Class CDerivedHenry Inherits CBaseHenry Sub New() MyBase.New() ‘留意:這句話要放在sub內的第一句 Console.WriteLine("派生類的結構") End Sub Protected Overrides Sub Finalize() Console.WriteLine("派生類的析構") MyBase.Finalize() End Sub Public Overrides Function GetY(ByVal x As Integer) As Integer Me.y = x * 10 ‘protected類型的me.y卻可以在派生類中使 用 Console.WriteLine("派生類的GetY辦法,後果為:" & Me.y) Return Me.y End Function Public Sub NewY() Console.WriteLine("派生類的新辦法") End Sub End Class
“你看清了吧,我們經過聲明Inherits關鍵字,來標 識該類的基類是誰,假如沒有標識的類,比方CBaseHenry,VB.Net就會視其為派 生自Object基類,這是種隱式承繼,和構造是隱式承繼自ValueType 類的方式是 一樣的。”大李指著屏幕跟我講解著。
“那這些overrides與 overload標識是什麼意思呀?”我隱隱覺得到它們的意義,卻沒法清楚地說 出來。
“我們運用承繼,也要允許派生類中的某些屬性或辦法有與 基類不同的行為,我們想‘重寫’它,但基類也得要贊同你才干重寫 呀,否則不就會發作命名抵觸了嗎?由於派生類的對象是可以運用基類的公用成 員的,那怎樣知道哪些基類的辦法與屬性是被派生類重寫了呢?所以就必需有一 個商定:我們在基類中用Overridable修飾符來標識允許基類中的屬性或辦法在其 派生類中被重寫,沒有標識的其實就是默許為有NotOverridable修飾符來隱式地 標識,用於提示編譯器該屬性或辦法不可被重寫;然後在派生類重寫時,我們就 用Overrides修飾符來標識哪些是重寫自基類中定義的 Overridable 屬性或辦法 。”大李娓娓道來,“我們來演練一下對派生類的操作吧。 ”
Public Sub Main() Dim obj As CDerivedHenry = New CDerivedHenry() obj.GetY(4) '調用派生類的GetY辦法 obj.OldY() '調用基類的oldY辦法 obj.NewY() '調用派生類的NewY辦法 End Sub
然後大李按了一下F5鍵,在“輸入”窗口中就呈現 了如下的運轉後果:
基類的結構 ‘開 始運轉New CDerivedHenry() 派生類的結構 派生類的GetY辦法,後果為:40 ‘obj.GetY(4)的運轉後果=4*10, 不等於基類的(4+10) 基類的OldY辦法 ‘obj.OldY()的運轉後果 派生類的新辦法 ‘obj.NewY()的運轉後果 派生類的析構 基類的析構
“你看,你只在Main中實例化了一個派生類的對 象,為什麼先會呈現‘基類的結構’?”大李問。
“這個麼,”我開端在代碼中檢查起來,“是這句了。 ”我手指著派生類裡的這段代碼:
Sub New() MyBase.New() ‘留意:這句話要放在sub內的第一句 Console.WriteLine("派生類的結構") End Sub
“沒錯,我們必需要留意這一點,就是派生類的結構函 數與析構函數都必需重新編寫。New 結構函數普通用於翻開文件、銜接到數據庫 、初始化變量以及處置任何需求在可運用對象前完成的其他義務。我們必需在Sub New 結構函數中的第一行代碼運用語句 MyBase.New(),來調用類層次構造中該類 的基類的結構函數,以取得基類的性質。析構則是在Sub Finalize中執行完對派 生類的的清算義務,如保管形態信息、封閉文件和與數據庫的銜接,以及執行在 釋放對象前必需完成的其他義務之後,在析構函數的最後一句運用語句 MyBase.Finalize() 顯式調用其基類的 Sub Finalize 辦法,以析構MyBase.New ()結構的內容。所以你從順序運轉後果中也可以很清楚的看出這一順序。” 大李敲擊著屏幕,象是給我提個醒。
“明白了,我會記著的。 ”我誠實地搖頭回應著。
大李忽然想起了什麼,低頭對我說: “講到類的承繼,我們還得看一下重載與隱藏的問題。”