我已经开始在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 因为MyClass
implements 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
展示......True
TextBox
ListBox
当您进行VBA继承时,只能使用Implements关键字来实现类定义。也就是说,要实现的类相当于C++/C#的抽象类:只有属性/方法定义。
一般来说,您的示例不是类多态性的一种形式。当您实际派生一个实例以将其类化为另一个实例时,就会发生类多态性。事实并非如此。尽管 和TextBox
都是ListBox
一种Control
类型,但它们实际上并不是从Control
类派生的。注意:它们也可能是另一个集合的成员 - 它们TypeOf
在对象层次结构类型中处于较高位置(表单,还有 Component 和 IComponent,因为 Forms 实现了这一点)。