我已经开始在Access中学习VBA.我读过该语言没有继承.然后我读了一个示例代码,看起来它实际上有继承:
Dim ctrl As Control
...
If TypeOf ctrl Is TextBox Then ...
If TypeOf ctrl Is ListBox Then ...
Run Code Online (Sandbox Code Playgroud)
在我看来,TextBox,ListBox都是从Control继承而来的.有人可以解释一下吗?
小智 5
不,它们不是从Control类派生的。他们实现Control的定义/方法和属性签名。TypeOf和运算符的工作方式Is是检查类的实例是否实现 3 个类别之一(如下所列)。
打开一个新工作簿
转到VBE并添加
一个类模块并将其命名为:MyClass
在代码视图中仅添加Implements MyInterface
一个类模块并将其命名为:MyInterface
在代码视图中 -不执行任何操作/留空
一个模块并复制粘贴以下代码并运行它
Sub Main()
Dim cls As MyClass
Set cls = New MyClass
Debug.Print TypeOf cls Is MyClass
Debug.Print TypeOf cls Is MyInterface
End Sub
Run Code Online (Sandbox Code Playgroud)
结果可能会令人惊讶
True
True
Run Code Online (Sandbox Code Playgroud)
cls变量有两种类型-MyClass和MyInterface
正如你所看到的,除了定义之外cls,没有继承任何东西MyInterface。使用时TypeOf,Is它实际上显示 true 因为MyClassimplements MyInterface。不是因为它是从MyInterface类派生的,而是因为它实现了它。
现在,假设
result = TypeOf objectexpression Is typename
Run Code Online (Sandbox Code Playgroud)
该TypeOf运算符确定变量的运行时类型是否与typename兼容。兼容性取决于typename的类型类别。共有三类
类 objectexpression的类型为typename或继承自typename
结构 对象表达式的类型为typename
接口 objectexpression实现typename或继承自实现typename的类
具体尝试理解第三类——接口。
我认为此时您应该真正理解为什么要TypeOf varName Is varType展示......TrueTextBoxListBox
当您进行VBA继承时,只能使用Implements关键字来实现类定义。也就是说,要实现的类相当于C++/C#的抽象类:只有属性/方法定义。
一般来说,您的示例不是类多态性的一种形式。当您实际派生一个实例以将其类化为另一个实例时,就会发生类多态性。事实并非如此。尽管 和TextBox都是ListBox一种Control类型,但它们实际上并不是从Control类派生的。注意:它们也可能是另一个集合的成员 - 它们TypeOf在对象层次结构类型中处于较高位置(表单,还有 Component 和 IComponent,因为 Forms 实现了这一点)。