Henry的VB.NET之旅(十一)—可视继承

继承

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

运行!点击一下“保护”按钮,果然只出现了一个消息框:“派生的保护按钮”。

(未完待续)

时间: 2024-12-25 23:13:23

Henry的VB.NET之旅(十一)—可视继承的相关文章

Henry的VB.NET之旅(十二)—事件驱动

Henry的VB.NET之旅(十二)-事件驱动 韩睿 "可视继承原来这么方便!"我心中默默地感叹一声.一会儿之后,我抬头扫了一眼屏幕上的代码后,突然发现了一个新问题,按钮的单击事件程序现在已经变成了: VB.NET程序 VB程序 Private Sub btnProtected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtected.Click MsgBox("

Henry的VB.NET之旅(十三)—标准事件处理程序

标准|程序 Henry的VB.NET之旅(十三)-标准事件处理程序 韩睿 "感兴趣就好!"大李微微点点头,然后问我道,"你知道程序是怎么知道哪些对象可以引发何种事件,以及怎么样把事件和事件处理程序关联起来?" 见到我迷茫的眼神,大李用鼠标点击打开被Region合起来的"Windows 窗体设计器生成的代码",指着中间的一句自动生成的代码: Friend WithEvents Button1 As System.Windows.Forms.Butt

Henry的VB.NET之旅(十四)—动态关联事件与处理程序

程序|动态 Henry的VB.NET之旅(十四)-动态关联事件与处理程序 韩睿 "要解释新的事件处理程序的方法,我们需要先说几个重要的问题."大李开始严肃起来,我也只得挪动一下身子,表现出正襟危坐的架势. "我们首先讨论一下事件是怎么产生的.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互,例如鼠标单击引起的,也可能是由某些其他的程序逻辑触发的.引发事件的对象叫做事件发送方(啊,听到这,Henry突然明白了事件处理程序中的第一个参量为什么叫Sender了,就

Henry的VB.NET之旅(十五)—动态事件处理方法

动态 Henry的VB.NET之旅(十五)-动态事件处理方法 韩睿 "大李哥,"我不免为自己问了如此多的问题而不好意思起来,"您刚才所说的事件的委托是怎么回事呀?" 大李显然是明白我会提问的:"我所说过事件驱动设计中的三要素你还记得吧?" "当然,就是指对象.事件和事件处理程序."我流利地回答道. "对象和事件处理程序我们已经分析过了.要想彻底了解事件驱动程序的来龙去脉,我们必须了解事件的构成."见到我又一

VB 从零开始编外挂(十一)

传奇外挂制作的资料 -------------------------------------------------------------------------------------------------------------------------------------------------------- 显血:7A0D3: 75 EB超负重:99A40: 76 EB offset 原 改 防石化: 00466F80: 75 90 00466F81: 2E 90稳如泰山: 00

Cocos2D:塔防游戏制作之旅(十一)

是时候放一些坏家伙来搅合一下了! 打开HelloWorldLayer.h并且添加以下代码: // Add these instance variables int wave; CCLabelBMFont *ui_wave_lbl; // Add the following property to the properties section @property (nonatomic,strong) NSMutableArray *enemies; 使HelloWorldLayer.m文件修改如下

VB.Net中文教程(4) 类别继承(Inheritance)关系

继承|教程|中文 1. 类别之继承 类别之间﹐有些互为独立﹐有些具有密切关系.兹介绍类别间常见的关系──「父子」关系﹔由于儿女常继承父母之生理或心理特征﹐所以又称此关系为「继承」(Inheritance) 关系.类别间之密切关系﹐把相关的类别组织起来﹐并且组织程序内之对象.若程序内之对象毫无组织﹔呈现一片散沙﹐就不是好程序.完美之VB程序﹐必须重视类别间之关系﹐对象是有组织的. 如果 A类别「继承」 B类别﹐则称 A为「子类别」(Subclass)﹐也称B 为「父类别」(Superclass)﹐

vb.net类的封装,继承,多态,抽象之一

封装|继承   封装就是把各种方法和变量合并到一个类,用这个类代表某个对象为完成一定的任务所能保存的范围以及它能执行的操作. 继承就是根据现有类的方法和成员变量生成新的类的功能 多态就是对象随着程序执行而使其形式发生改变的能力. 抽象就是在暂时忽略对象的具体细节的功能. 在类中,构造器的方法使简化类的成员变量的初始化处理,当用继承从一个类构造另一个类的时候,会有两套构造器发生作用,即基类构造器和派生类构造器 例如: Public Class Form1    Inherits System.Wi

学习vb.net需要什么

问题描述 众所周知,学习一门技术的话,除了勤奋之外,还需要好的方法和技巧.因工作需要,现在我想好好学习一下vb.net,请问有什么好的书籍.网站.工具,以及好的方法和技巧,请大家不吝赐教.谢谢了 解决方案 解决方案二:学习VB.NET的捷径是先学会C#.因为你知道用一种语言开发,语言本身占3分,其余7分是平台类库和具体的开发技术,而如果你不会C#,就很难看懂C#的代码例子.技术书籍和论坛中的解决方案,这些东西远远比VB.NET的丰富,而C#和VB.NET使用的类库又是相通的.解决方案三:楼上扯淡