Henry的VB.NET之旅(十一)—可視繼承
2024-07-10 13:01:23
供稿:網友
henry的vb.net之旅(十一)—可視繼承
韓睿
閉關修練了一晚上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
運行!點擊一下“保護”按鈕,果然只出現了一個消息框:“派生的保護按鈕”。
(未完待續)