VB.NET之旅(六)—重載與隱藏。本站提示廣大學習愛好者:(VB.NET之旅(六)—重載與隱藏)文章只能為提供參考,不一定能成為您想要的結果。以下是VB.NET之旅(六)—重載與隱藏正文
大李坐在轉椅上左右晃動著,手中的一個硬幣在他指間乖巧地翻騰著。 “hi, Henry。你對重寫與重載的意思了解是怎樣樣的呢?”
我正盯著他手中的硬幣發呆呢,“哦,重寫,就是您方才舉的示例中,在派 生類中用Overrides重新編寫有Overridable標識的基類的辦法或屬性;重載麼, 就是我們可以用異樣的稱號,在一個類中用不同的參數列表來創立多個辦法和屬 性,在調用時就可以順應不同參數類型的要求。”
“在一個類 中創立?”大李的左眉向上一挑,我就知道我能夠說錯了。但是,好象沒有 說錯什麼呀。
“那好,你看一下,這樣的寫法會有什麼後果?”
Public Class CBaseHenry Public Sub oldY() Console.WriteLine("基類的oldY辦法") End Sub End Class Public Class CDerivedHenry Inherits CBaseHenry Public Overloads Sub oldY(ByVal j As Integer) Console.WriteLine("派生類的oldY辦法") End Sub End Class Public Sub Main() Dim obj As CDerivedHenry = New CDerivedHenry()
然後大 李寫了obj.oldY這時呈現的智能感知菜單上呈現了參數列表:
“咦,第二個oldY()無參數進程簽名應該是基類定義的呀。為什 麼在派生類的實例中也會呈現呀!”我不由獵奇起來。
“沒錯 。還記得我上次曾顯式編寫結構函數的事嗎?我用了一個mybase.new()用於承繼 下基類的性質。如今沒有寫,其實是一種默許的隱式調用。”大李一說我就 明白了,其完成在的派生類應該是內含兩個oldY辦法了,無參數的oldY()其實就 是基類的辦法,是由於Overloads和Mybase.new()雙重作用的影響。
“那你再看這樣的變化狀況。”大李象是看出我曾經明白了這 個問題。他在派生類中添加了一個用Overloads標識的與基類方式分歧的無參數 oldY()。
Public Class CBaseHenry Public Sub oldY() Console.WriteLine("基類的oldY辦法") End Sub End Class Public Class CDerivedHenry Inherits CBaseHenry Public Overloads Sub oldY(ByVal j As Integer) Console.WriteLine("派生類的oldY辦法1") End Sub Public Sub oldY() Console.WriteLine("派生類的oldY辦法2") End Sub End Class Public Sub Main() Dim obj As CDerivedHenry = New CDerivedHenry() obj.oldY() End Sub
“好的,如今你再說說看,如今的obj.oldY()的運轉 後果會打印出什麼?”大李手按在F5運轉鍵上問我。
“應該是 派生類的,不對,基類,呃,派生類……”我一下子就暈了。
“呵呵。”大李也不由發笑起來。然後點擊了一下F5鍵。後果 是:
派生類的oldY辦法2
“這就叫隱藏,我們用 overloads方式,隱藏了基類的同名辦法。以防用戶發作混雜。普通來說,隱藏有 兩種狀況,一種是經過范圍來完成。比方你定義一個全局變量x,但在一個辦法中 ,你又定義了一個部分變量x,在辦法中運用x時,運用的是部分變量的那一個, 也就是用部分變量x在辦法中隱藏了全局變量x。另一種狀況,就是經過承繼來隱 藏,辦法麼,除了方才用的overloads,還可以用Shadows關鍵字來完成。 ”
“Shadows?暗影?倒是很貼切的名字。這個是怎樣用的呢 ?”我興味由但是生。
“Shadows功用很強的。”說著, 大李又開端修正方才的代碼了。
Public Class CBaseHenry Public Sub oldY() Console.WriteLine("基類的oldY辦法") End Sub End Class Public Class CDerivedHenry Inherits CBaseHenry Public Shadows Sub oldY(ByVal j As Integer) Console.WriteLine("派生類的oldY辦法") End Sub End Class Public Sub Main() Dim obj As CDerivedHenry = New CDerivedHenry()
再寫到 obj.oldY時,呈現的智能感知菜單上就剩下一個辦法了。
“哈,真的呢,基類的辦法看不到了。但是,這和重寫的效果豈 不是一樣了嗎?”我不由地又想起一個問題,假如是一樣的作用,要 Shadows干什麼呀。
“還是有區別的。”大李開端扳著指頭數 起來,“最分明的區別在於,隱藏適用於任何元素類型,你可以在派生類中 用Public Shadows oldY as Integer來隱藏基類的oldY()辦法;而重寫只能適用 於辦法與屬性,而且聲明參數與修飾符都要求完全分歧。”
“ 還要留意一點,當派生類又派生出一個子類時,重寫與隱藏都會被承繼下去。當 然,假如在派生類中是用private來修飾Shadows成員的話,它的子類就會承繼它 基類的成員了。”
“我倒是覺得,如今VB.NET對承繼的處置功 能真的很弱小,有承繼,關於編程者來說,真的是件壞事。”我不由感慨道 。
“不錯,承繼層次體系是有很多益處,但是事物總是有其雙面性 ,承繼也有不少問題,其中最費事的,就是‘軟弱的基類’。” 大李緊鎖眉頭仔細地說。
“哦,什麼叫‘軟弱的基類’ ?”我不解地問。