如何在VBA的类中使用私有方法?
我在课堂上写了私人程序
Private Sub setStartShift()
但是我不能这样称呼:
this.setStartShift
答案 0 :(得分:2)
使用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
在VBA中,this
的本质体现在Me
隐式标识符中:它引用该类的当前实例,并通过其默认接口公开。换句话说,如果您正在名为Class1
的类模块中编写方法,则在该过程中Me
引用Class1
的当前实例,就像访问是从外面来的:
specifications告诉我们Me
的工作原理(重点是我的意思):
在
<procedure-body>
中定义的过程声明的<class-module-code-section>
中,保留名称Me
的声明类型是由封闭的类模块定义的命名类和数据值Me
的of是对 该对象的引用,该对象是当前激活该函数的目标对象 。
进一步,来自section 5.3.1.5:
作为方法的每个过程具有一个隐式ByVal参数,该参数称为当前对象,该对象与该方法调用的目标对象相对应。当前对象充当具有过程范围的匿名局部变量,其声明的类型为包含方法声明的类模块的类名。
换句话说,当您这样做时:
Dim foo As Class1
Set foo = New Class1
foo.DoSomething 42
编译后的代码实际运行方式与以下内容更接近:
Dim foo As Class1
Set foo = New Class1
Class1.DoSomething foo, 42
并且由于参数的类型为包含方法声明的类模块的类名,因此成员必须存在于该类的Public
接口上,用于成员调用在编译时即可解决。
"Understanding 'Me' (no flowers, no bees)" on my "Rubberduck News" blog