实例3-4 属性的使用
该实例实现步骤如下。
1 创建模块
在本章的项目chapter3下,右键单击该项目名下面的文件夹“类及对象”,在弹出菜单中选择“添加”→“模块”菜单命令,在弹出的对话框中输入模块名称AttributeModule,单击“添加”按钮完成模块的创建。
2 添加代码
双击AttributeModule.vb进入该模块的代码编辑窗口,向其中添加代码3-9中的代码。
代码3-9 AttributeModule.vb
01. Module AttributeModule 02. Public Class Attribute '定义一个类,名称为Attribute 03. Public str1 As String = "" '定义两个字符串变量str1,str2并赋初值 04. Public str2 As String = "" 05. Public Property prstr() As String '定义一个属性 06. Get '读取属性的值 07. Return str1 08. End Get 09. Set(ByVal value As String) 10. str1 = value '设置属性的值 11. End Set 12. End Property 13. Default Property dprs(ByVal str As String) As String '定义默认属性 14. Get '读取和设置属性的值 15. Return str 16. End Get 17. Set(ByVal value As String) 18. str2 = value 19. str = value 20. End Set 21. End Property 22. End Class 23. Sub main()
24. Dim sa As New Attribute '实例化Attribute 25. sa.prstr = "第一个属性" '设置类中第一个属性的值 26. sa("第二个属性") = "secondly" '设置类中第二个属性的值 27. Console.WriteLine(sa.prstr) 28. Console.WriteLine(sa("第二个属性")) 29. Console.WriteLine(sa.str1) 30. Console.WriteLine(sa.str2) 31. End Sub 32. End Module
代码3-9执行步骤如下:
① 第2行代码定义一个类,名称为Attribute。第3、4行代码定义两个字符串变量str1、str2,并赋初值;
② 第5行到第12行代码定义一个属性,第6行到第8行代码读取属性的值,第9行到第11行代码设置属性的值;
③ 第13行代码用“Default”定义该类的一个默认属性。第14行到第20行代码分别用于读取和设置属性的值;
④ 第24行代码实例化Attribute类;
⑤ 第25行代码设置类中第一个属性(prstr)的值;
⑥ 第26行代码设置类中第二个属性(dprs)的值;由于该属性是类的默认属性,故可以省略该属性的名;
⑦ 第27行到第30行代码显示输出相应属性和字符串的值。
(3)运行结果
按F5键,运行程序,结果如图3-5所示。
图3-5 实例3-4运行结果
3.方法
方法表示对象可执行的操作,例如,Car对象可以有StartEngine,Drive和Stop方法。VB.NET中通过向类中添加过程(Sub过程或函数)来定义方法。在VB.NET中,类的方法就是在类中用户声明的那些公有的Sub或Function过程。Sub和Function的区别是:用Sub来创建一个方法,它将不返回数值;若是利用Function创建一个方法,它将返回一个数值作为结果。示例如下:
Sub MyWorks() End Sub Function MyValue() As Integer Return n End Function
前面章节对Sub过程和Function过程已作了介绍,这里就不再重复了。
4.事件
事件是对象从其他对象或应用程序接收的通知,或者是对象传输到其他对象或应用程序的通知。事件使对象得以在每当特定情况发生时执行操作,比如,Car类的一个事件示例是Check_Engine事件。因为Microsoft Windows是事件驱动的操作系统,所以事件可来自其他对象、应用程序或用户输入(如鼠标单击或键盘按键)。
事件是一个信号,它告知应用程序有重要情况发生。例如,用户单击窗体上的某个控件时,窗体引发一个Click事件并调用一个处理该事件的过程。事件还允许在不同任务之间进行通信。比如,应用程序脱离主程序执行一个排序任务,若用户取消这一任务,应用程序可以发送一个取消事件让排序过程停止。下面从几个方面介绍事件。
(1)声明事件
使用Event关键字在类、结构、模块和接口内部声明事件,示例如下:
Event AnEvent(ByVal EventNumber As Integer)
(2)引发事件
事件就像是通告已发生重要情况的消息。广播该消息的行为叫引发事件。在VB.NET中,使用RaiseEvent语句引发事件,示例如下:
RaiseEvent AnEvent(EventNumber)
必须在声明事件的范围内引发事件,如派生类不能引发从基类继承的事件。
(3)事件发送器
任何能引发事件的对象都是事件发送者,也称事件源。窗体、控件和用户定义的对象都是事件发送器。
(4)事件处理程序
事件处理程序是相应事件发生时调用的过程。用户可以将任何有效子过程用做事件处理程序。可是,不能将函数用做事件处理程序,因为它不能将值返回给事件源。
Visual Basic采用标准命名约定对事件处理程序进行命名,即用下画线把事件发送器和事件的名称组合起来。例如,名为button1的按钮的单击事件应命名为Sub button1_Click。
注意
建议读者使用此命名约定定义事件的事件处理程序。但这并不是必选的方法,读者可以使用任何有效的子过程。
(5)关联事件与事件处理程序
在事件处理程序生效之前,首先必须使用Handles或AddHandle语句将它与事件关联。
WithEvents语句和Handles子句提供了陈述性指定事件处理程序的方法。WithEvents所声明对象引发的事件可以由任何子过程用命名此事件的Handles子句来处理。虽然Handles子句是关联事件与事件处理程序的标准方法,但它仅限于在编译时关联事件与事件处理程序。
AddHandler和RemoveHandler语句要比Handles子句更灵活。它们允许在运行时动态地将事件与一个或更多的事件处理程序连接或断开,而并不要求使用WithEvents声明对象变量。
在某些情况下,如使用窗体或控件所关联的事件,VB.NET会自动引出一个空事件处理程序并将它与某个事件关联。例如,在设计模式下双击窗体上的命令按钮时,VB.NET会为命令按钮创建一个空事件处理程序和一个WithEvents变量,示例如下:
Friend WithEvents Button1 As System.Windows.Forms.Button Protected Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub
3.3.4 共享成员
共享成员就是被类的实例所共享的属性、过程、字段等,一些编程语言将这样的成员称为静态成员。
(1)共享字段和属性
当信息是类的一部分而非特定于类的任何实例时,共享字段和属性很有用。更改共享字段和属性的值,相当于更改与该类及该类的所有实例关联的值。
另一方面,更改与任何一个实例关联的非共享字段或属性的值,不会影响该类的其他实例中的该字段或属性的值。一个类的各个实例的非共享字段和非共享属性是相互独立的。
这样,共享字段和属性的行为就像全局变量一样,只可以从类的实例或限定的类名称进行访问。如果没有共享字段和属性,就需要使用模块级变量来获得同样的效果,但模块级变量会使类难以理解和维护。另外,以这种方式使用模块级变量与类所表示的封装的概念冲突。
(2)共享过程
共享过程是不与类的特定实例相关联的类方法。例如,在Math类内定义的Cos方法是共享方法。可以将共享过程作为对象的方法调用或直接从类调用。
共享过程和属性不具有对类的实例的访问权限。因此,在共享方法中只允许对非共享数据成员进行限定引用。
注意
建议不要编写通过类的实例访问共享成员的代码。因为编译器会忽略对共享成员的限定,并认为是直接通过类访问了它。在某些情况下,如想要使用限定对象运行某些代码,Visual Basic编译器将会为通过类的实例访问共享成员生成一个警告。IntelliSense 不会显示类的实例的共享成员。
下面以实例说明共享成员的创建和引用。