閉關修練了一晚上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
運行!點擊一下“保護”按鈕,果然只出現了一個 消息框:“派生的保護按鈕”。