在学习了VB.NET这门编程语言后,大家会慢慢的发现这门语言中隐藏的知识是很广的,有很多功能值得我们去深入的研究。比如VB.NET Override就是其中一个比较难掌握的知识点。健康知识平台 在类或控件的继承中,子类或子控件封装了父类的所有函数,其中包括事件处理程序。本文将着重讨论事件处理程序的VB.NET Override实现方法。
继承事件处理程序
当组件被继承时,它的所有成员都被封装到子类中。事件处理程序是响应特定事件的方法,是组件成员之一,因而也被继承。请看一个典型的事件处理程序:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e as _
System.EventArgs)
Handles Button1.Click
Static Counter as Integer = 0
Counter += 1
MessageBox.Show (
" This button has been clicked " & _
Counter.ToString() & " times.")
End Sub
我们看到,宣告部分末尾的 Handles 子句把处理程序关联到特定的事件上。具体而言,上述代码将在 Button1.Click 事件发生时运行。这就是用于定义事件处理程序的典型语法。
为了实现VB.NET Override,你必须使用 Overridable 关键字,并且重新定义其可见性为 Protected 、 Protected Friend 或者 Public 。下面示范如何 override 事件处理程式:
Protected Overridable Sub Button1_Click(ByVal sender As System.Object, _
ByVal e as System.EventArgs)
Handles Button1.Click
Static Counter as Integer = 0
Counter += 1
MessageBox.Show
(" This button has been clicked " & _
Counter.ToString() & " times.")
End Sub
在组件中继承事件处理程序
事件处理程序的VB.NET Override固然与其它方法的 override 大同小异,有一点却不得不提:在 override 事件处理程序时必须除去 Handles 子句。
如何 override 组件的事件处理程序
1) 在事件处理程序的宣告部分加入 Overrides 关键字
请注意:不要附加 Handles 子句。因为父类的处理程序已经关联了特定事件,子类将继承这一切。换句话说,父类所关联的事件可以激活子类的处理程序,因而这里的 Handles 子句是多余的。
下面示范如何 override 前述事件处理程序:
Protected Overrides Sub Button1_Click(ByVal sender As System.Object, _
ByVal e as System.EventArgs)
Static Counter as Integer = 0
Counter += 1
MessageBox.Show
(" This inherited button has been clicked " & _
Counter.ToString() & " times.")
End Sub
2) 为什么不需要 Handles 子句
前面提到,我们没有使用关联事件的 Handles 子句并不是一个疏漏,而是由 .NET 框架的事件处理机制所决定的。父类中的 Handles 子句将事件处理程序关联到特定事件上,这种关联将被子类继承。因此,即令子类中没有 Handles 子句,父类所关联的事件也能激活子类的事件处理程序。倘若此时加上 Handles 子句,则处理程序将被再次关联到事件上。重复关联的后果是处理程序将被连续激活两次。例如:
' 错误的代码
Protected Overrides Sub Button1_Click(ByVal sender As System.Object, _
ByVal e as System.EventArgs)
Handles Button1.Click
Static Counter as Integer = 0
' 本例中使用了 Handles 子句,
' 因而每当按钮 Button1 被点击一次,
' 变量 Counter 将会增加两次 ;
Counter += 1
' 消息框也会弹出两次,
' 显示的内容也将违背设计意图
MessageBox.Show (" This inherited button has been clicked " & _
Counter.ToString() & " times.")
End Sub
结论
在 Visual Basic .NET 中,事件处理程序的VB.NET Override可能造成难以侦错的 bug 。例如在使用 Handles 子句关联事件处理程序时就要格外小心,以免发生重复关联。
首先,宽带路由器是一种NAT的原理,分为LAN、WAN口,就有2个IP,LAN提供局域网网关IP,WAN口提供来连接Internet,当路由器拨上号后,会从电信或者网通、铁通上获取2个DNS,这个和本机自己ADO.NET设置的IP没有什么关系,这个DNS基本上都是电信或者网通、铁通认为能够正常解析的DNS IP。
接下来讲讲当使用宽带路由器的PCADO.NET设置DNS IP为LAN IP的时候,DNS的工作原理:DNS请求包--->LAN IP--->真正的DNS IP(WAN口得到的主DNS IP);
而当PC设置为当地的公网DNS IP的时候,DNS的工作原理:DNS请求包--->真正的DNS IP(PC上设置的主DNS IP)。
从以上可以看出区别:使用代理的时候,要多出一个步骤,ADO.NET设置数据包先被发送到了宽带路由上,再有路由器将请求包发到目的DNS IP(这里有封包和解包的过程);而不使用代理的时候,DNS数据包被直接发送到目的DNS IP进行解析。
下图的客户端配置中,服务端为ADSL接入,申请的动态域名为server.iplink.com.cn,此时客户端如果没有配置DNS,则VPN拨号链接会因无法解析服务端的ADO.NET设置动态域名而造成链接异常,如下图的test链接中会话状态始终为关闭状态。
![](http://blog.chinaunix.net/attachment/201208/11/26973135_1344666200yvny.png)
内网实行DHCP分配IP地址,每台PC的TCP/IP属性均设为自动获取IP,此时由于PC本身并未设置自身的公网DNS,其自动获取时所分的一定是路由器上预先设置的公网DNS,如果此时HiPER上未设DNS则内网PC即便能ADO.NET设置够分得地址也是无法打开网页的,就是因为在封包解包的时候由于代理的原理使得实现域名解析的工作不是很稳定,才会造成有时能够解析有时候不能解析的问题,所以我们建议用户为了网络的稳定性和快速最好直接在PC和路由器上设置公网DNS,不建议使用路由器的DNS代理功能。
阅读(949) | 评论(0) | 转发(0) |