如何在 VBA 中的类中使用私有方法?
我在课堂上写了私有程序
Private Sub setStartShift()
Run Code Online (Sandbox Code Playgroud)
但我不能这样称呼它:
this.setStartShift
Run Code Online (Sandbox Code Playgroud)
使用Me而不是this访问当前实例,但仅通过 公开接口Me。
使用非限定成员调用来访问私有接口。
Public Sub DoSomething()
DoSomethingInternal ' implicit call
'Call DoSomethingInternal '' explicit call (obsolete)
End Sub
Private Sub DoSomethingInternal() ' not accessible through public interface
' do stuff
End Sub
Run Code Online (Sandbox Code Playgroud)
在 VBA 中, 的本质this体现在Me隐式标识符中:它引用类的当前实例,通过其默认接口公开。换句话说,如果您在名为 的类模块中编写方法Class1,则在该过程中Me引用 的当前实例Class1,就好像您从外部访问它一样:

规格告诉我们真正的工作原理(强调我的Me):
在保留
<procedure-body>名称中定义的过程声明中,<class-module-code-section>保留名称的声明类型Me是由封闭类模块定义的命名类,并且数据值是Me对作为当前活动调用的目标对象的对象的对象引用的函数。
此外,根据第 5.3.1.5 节:
作为方法的每个过程都有一个称为当前对象的隐式 ByVal 参数,该参数对应于方法调用的目标对象。当前对象充当具有过程范围的匿名局部变量,其声明的类型是包含方法声明的类模块的类名。
换句话说,当你这样做时:
Dim foo As Class1
Set foo = New Class1
foo.DoSomething 42
Run Code Online (Sandbox Code Playgroud)
编译后的代码实际运行方式更接近如下:
Dim foo As Class1
Set foo = New Class1
Class1.DoSomething foo, 42
Run Code Online (Sandbox Code Playgroud)
由于参数的类型是包含方法声明的类模块的类名,因此该成员必须存在于该类的Public接口上,以便在编译时可解析成员调用。
我的“橡皮鸭新闻”博客上的“理解‘我’(没有花,没有蜜蜂)”
| 归档时间: |
|
| 查看次数: |
1859 次 |
| 最近记录: |