nbsp; Balance is 100 Balance is 400 Balance is 480
此程序中﹐orange先接受Display()讯息﹐印出存款额﹔再接受add(300)讯息﹐使存款额提高 300元﹐再接受Display()讯息﹐依序下去。Display()传回来目前对象orange之参考值,add()则传回新诞生对象之参考值。
2. 深入了解Me参考
VB在编译时﹐会自动为程序成员产生Me参考变量﹐并令Me固定参考到目前对象(Current Object)。于此将细谈VB如何产生Me参考变量﹐让您更能深刻了解Me参考变量的特性和角色。首先﹐VB在编译程序成员时﹐会暗中偷加上1 个参考参数──Me﹐成为该程序成员的第1 个参数。例如﹕
Class Person Private name As String Priavte age As Integer Public Sun New(ByVal na As String, ByVal a As Integer) name = na age = a End Sub Public Sub Display() Messagebox.Show( name + ", " + str( age ) ) End Sub End Class
在编译此程序时﹐VB会将偷加上Me参考变量如下﹕
Class Person Private name As String Priavte age As Integer Public Sun New( ByVal Me As Person, ByVal na As String, ByVal a As Integer) Me.name = na Me.age = a End Sub Public Sub Display(ByVal Me As Person) Messagebox.Show( Me.name + ", " + str( Me.age ) ) End Sub End Class
无论是在New()或Display()程序里﹐Me皆固定参考到目前对象﹐您不能改变Me之值。接下来﹐请看如何令Me参考到目前对象﹖假如有个Form1_Click()程序如下﹕ Sub Form1_Click( .... ) Dim x As New Person("Tom", 26) x.Display() End Sub
VB在编译时﹐会把指令──x.Display()转换为﹕ Person_Display(x)
意谓着﹕呼叫Person类别的Display()程序来处理x 对象之内容。在呼叫这程序时﹐就把x参考值传递给Display()程序里的Me参数﹐如下﹕
于是﹐Me就固定指向x对象了﹐而这x 对象就是我们欲处理之对象﹐亦 即就是目前对象了。请再看个例子吧﹗若Person类别改为﹕
Class Person Private name As String Priavte age As Integer Public Sun New(ByVal na As String, ByVal a As Integer) name = na age = a End Sub Public Sub Print() Me.Display() End Sub Public Sub Display() Messagebox.Show( name + ", " + str( age ) ) End Sub End Class
则VB会为这3 个程序成员加上Me参考值。其中Print()程序转换如下﹕ Public Sub Print(ByVal Me As Person) Person_Display( Me ) End Sub
上述的Me.Display()转换为Person_Display( Me )之后﹐就把这Print()内的Me值传给了Display()内的Me了﹐此时两个程序内的Me皆参考到目前对象了。 以上所提的一般程序成员并不包括共享程序成员(Shared Member Function)。还记得吗﹖共享程序成员的目的是﹕处理有关整个类别的事情﹐而不是用来处理对象之内容。在另一方面﹐Me参考到目前对象﹐一般程序成员经由Me来存取目前对象之内容。既然共享程序成员不需存取某特定对象之值﹐当然就不需要Me参考变量了﹐因之VB并不会为共享程序成员偷加上Me参考变量。简而言之﹐VB的规则是──
「VB编译时﹐并不会为共享程序成员加上Me参考变量﹐所以 共享程序成员里没有Me参考变量﹐也就无法存取对象之内容」
如前面所述﹐在呼叫一般程序成员时﹐必须把目前对象之参考值传递过去给该程序成员。但共享程序成员里并无Me参考﹐所以无法呼叫一般程序成员。可得知VB的规则── 「共享程序成员不能呼叫一般程序成员﹐但可呼叫别的共享程序成员」
反之﹐一般程序成员却可呼叫共享程序成员。例如﹕
Class Person Private name As String Priavte age As Integer Shared plast As Person
Public Sun New(ByVal na As String, ByVal a As Integer) name = na age = a plast = Me End Sub Shared Sub DispLast() plast.Display() ''''Display() Error !! End Sub Public Sub Print() DispLast() End Sub Public Sub Display() Messagebox.Show( name + ", " + str( age ) ) End Sub End Class
Display()是一般程序成员﹐共享程序成员DispLast()不能直接呼叫Display()程序如下﹕ Shared Sub DispLast() Display() Error !! End Sub
因为VB会将之转换为──
Shared Sub DispLast() Person_Display( Me ) Error !! End Sub
但DispLast()是共享程序成员﹐并无Me参考变量﹐所以错了。至于Print() 呼叫DispLast()﹐VB将之转换为──
Public Sub Print( ByVal Me As Person ) Person_DispLast() End Sub
虽然Print() 内有Me参考﹐但DispLast()是静态程序成员并不需要Me ﹐Print() 并未把Me传给DispLast()﹐这是对的。n
上一页 [1] [2] [3] 没有相关教程
|