Henry的VB.NET之旅(十一)—可視繼承

latitude發表於2004-02-05

???? Henry的VB.NET之旅(十一)—可視繼承<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

???????????????????????????????? 韓睿?

閉關修練了一晚上VB.NET的繼承程式的我,早上進入公司時自信滿滿。白經理看到我,問了一句:“學習得怎麼樣?對VB.NET是不是已經可以上手了?”我點了點頭:“應該可以做點事了吧。”“好的,”白經理拍了拍我肩膀說,“再跟大李好好學習幾天,會有機會的。”

得到領導的指示,我衝了杯咖啡,恭敬地走向大李,放在他的桌上。大李嘴角一翹,笑著說:“別這麼客氣,來,坐。讓我看看你昨天繼承學習得怎麼樣。今天我們來看一下VB.NET提供的新的繼承方式,視覺化繼承。”

“視覺化?是不是就是指在視覺化編輯器裡就可以實現的繼承方式?”我跟著問了一句。

大李點頭說:“當然,就是看得見的繼承。一般指的就是對窗體的繼承。”

我想了一下說:“在VB.NET中,窗體都已經是類的形式了,如果要實現窗體繼承,是不是生成一個基類窗體,然後通過宣告Inherits的方式在新窗體中實現對基類窗體的繼承?”

“大體上是這樣的,但今天我們來看一下怎麼通過視覺化編譯環境來實現這個過程。首先,是建一個基類窗體。”大李一邊說,一邊開啟VB.NET編譯器,從選單中選擇從檔案選單中依次選擇新建專案,開啟新建專案對話方塊。建立了一個名為 “可視繼承”的 Windows 應用程式。

然後右擊解決方案資源管理器中的“可視繼承”專案節點並選擇“屬性”。在專案的屬性中,將輸出型別從“Windows 應用程式”更改為“類庫”,然後單擊“確定”。

在“工具箱”的“Windows 窗體”選項卡上將一個按鈕新增到窗體中。命名為btnProtected。然後在它的“屬性”視窗中,將 Text 屬性設定為 “保護”,同時將 Modifiers 屬性設定為 Protected

接著大李雙擊 btnProtected 按鈕,切換到程式碼視窗,書寫了這樣的程式碼:

Private Sub btnProtected_Click(ByVal sender As System.Object, _

?ByVal e As System.EventArgs) Handles btnProtected.Click

??????? MsgBox("protected的按鈕")

End Sub

?

接著切換回設計視窗,新增了第二個按鈕btnPrivate,並將 Text 屬性設定為 “私有”, Modifiers 屬性設定為 Private

雙擊 btnPrivate 按鈕,新增了如下程式碼:

Private Sub btnPrivate_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnPrivate.Click

??????? MsgBox("private的按鈕")

End Sub

?

最後從“生成”選單中選擇“生成”,在專案的bin資料夾內生成了一個“可視繼承.dll”檔案。

“是不是這樣就可以完成基類窗體的建造了?”

“是呀。”大李手也沒停地說,“我們再通過整合環境來建一個派生的窗體吧。”

大李從“檔案”選單中選擇“新增專案”中的“新建專案”,建立了一個名為“派生窗體”的Windows 應用程式。右擊專案節點,選擇“新增”中的“繼承的窗體”。

在彈出的“新增新項”對話方塊中,可以看到已經選定了“繼承的窗體”,大李點選了“開啟”。又彈出一個“繼承選擇器”對話方塊中,從 “可視繼承.dll”中選擇“Form1”作為要從其中繼承的窗體,然後單擊“確定”。

於是在“派生窗體”專案中建立了一個從 “可視繼承”專案中的窗體Form1派生出的窗體,命名為“InheritanceForm”。

隨即在Windows 窗體設計器中,派生窗體的繼承而來的按鈕左上角會帶有一個箭頭標誌符號

大李拖動了一下“保護”按鈕,並任意地更改了一下按鈕的大小。然後,轉過頭來對我說:“你來試試改變一下‘私有’按鈕的大小吧。”我不以為然的接過滑鼠,可是,任憑我如何點選,拖拽,它仍巋然不動。

“啊?出了什麼問題?”我大吃一驚。

“自已想想嘍。”大李開始品味我倒給他的咖啡了。

我開始在大腦裡搜尋起這兩天學習的內容,慢慢地轉過彎來,“私有”按鈕在基類窗體內修飾符被大李設為“Private”,也就是說它在派生類中也不可被更改。我小心翼翼地向大李說明我的想法。

“沒錯,別怕說錯嘛。”大李點了點頭,“在窗體中的控制元件屬性也會跟著修飾符的設定而決定派生類能否對其進行更改。這個按鈕被設為了Private,它的大小與位置屬性當然在派生類中也無法被更改嘍。”

看到我若有所思地點著頭,大李給我出了道題:“你來試試改變一下在派生窗體中,點選‘保護’按鈕時彈出訊息框的內容,就改為‘派生的保護按鈕’吧。”

我跟大李在基類窗體中操作地一樣,雙擊了該按鈕,切換到程式碼視窗。寫了這句程式碼:

Private Sub btnProtected_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnProtected.Click

??????? MsgBox("派生的保護按鈕")

End Sub

?

接著,我右擊解決方案資源管理器中的 “派生窗體” 專案並選擇設為啟動專案。然後,右擊解決方案資源管理器中的 “派生窗體”專案並選擇“屬性”。在“派生窗體 屬性頁”對話方塊中,將“啟動物件”設定為繼承的窗體InheritanceForm

F5 鍵執行應用程式,滿懷欣喜地點選了一下“保護”按鈕。咦,結果彈出了兩個訊息框,第一個彈出的是基類窗體中寫的按鈕訊息內容“Protected的按鈕”,然後才彈出剛寫的訊息“派生的保護按鈕”。我一下就愣住了,“我不是已經改寫了click事件響應程式的程式碼了嗎?為什麼基類的訊息沒有遮蔽掉?”

大李悠悠然喝下一口咖啡,放下杯子。拍了拍我說:“遮蔽?你能遮蔽基類私有的成員嗎?”

“啊?”我趕緊看了一下基類窗體中的click事件處理程式。“真的呢,是private sub!”我傻傻地笑起來。

“對於窗體程式設計而言,預設的是對自身的處理,沒有考慮到對它的繼承,所以控制元件的事件處理程式都是以private來修飾的,用於封裝。但是修改也很容易,不是嗎?”大李又拍了拍我,起身出門了。

我拼命地搓了搓臉,開始回憶了一下實現繼承的方法,終於開始動手改程式。

首先,在基類窗體中寫:

Protected Overridable Sub btnProtected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtected.Click

??????? MsgBox("protected的控制元件")

End Sub

?

我正準備到派生類中改寫程式碼,大李又回來了,他站到我身後說:“你先別急著寫,看一下程式碼視窗上方的兩個下拉框,左邊一個是類名,你選擇一下InheritanceForm類的overrides,在右邊的方法名稱下拉框中就會出現可重寫的方法的名稱了。”

我按大李的話做,果然,在方法名稱下拉框中看到了btnProtected_Click,點選一下,就會出現該方法的空白程式碼段,我往程式碼段裡新增了一句訊息框的內容:

Protected Overrides Sub btnProtected_Click(ByVal sender As Object, _

ByVal e As System.EventArgs)

??????? MsgBox("派生的保護按鈕")

End Sub

?

執行!點選一下“保護”按鈕,果然只出現了一個訊息框:“派生的保護按鈕”。

(未完待續)

---------------------------------------------------------------

宣告:本文版權與解釋權歸韓睿所有,如需轉載,請保留完整的內容及此宣告。

QQ: 18349592???? E-Mail: henry7685@hotmail.com

請訪問本人專欄:http://www.csdn.net/develop/author/netauthor/Latitude/

相關文章