我已经开始在Access中学习VBA了。我读过该语言没有继承。 然后我读了一个示例代码,看起来它实际上有继承:
Dim ctrl As Control
...
If TypeOf ctrl Is TextBox Then ...
If TypeOf ctrl Is ListBox Then ...
在我看来,TextBox,ListBox都是从Control继承而来的。有人可以解释一下吗?
答案 0 :(得分:4)
没有。它们不是来自Control
类。他们实现Control
的定义/方法和属性签名。 TypeOf
和Is
运算符的工作方式是检查类的实例是否实现了3个类别中的一个(下面列出)。
打开新工作簿
转到VBE并添加
类模块并将其命名为:MyClass
在代码视图中只添加Implements MyInterface
类模块并将其命名为:MyInterface
在代码视图中 - 什么都不做/留空
a 模块并复制粘贴以下代码并运行
Sub Main()
Dim cls As MyClass
Set cls = New MyClass
Debug.Print TypeOf cls Is MyClass
Debug.Print TypeOf cls Is MyInterface
End Sub
结果可能令人惊讶
True
True
cls
变量有两种类型 - MyClass
和MyInterface
正如您所看到的,cls
不会从MyInterface
继承任何内容,而是定义。使用TypeOf
和Is
时,它实际上显示为true,因为MyClass
实现了MyInterface
。不是因为它来自MyInterface
类,而是因为它实现它。
现在,假设
result = TypeOf objectexpression Is typename
TypeOf
运算符确定变量的运行时类型是否与 typename 兼容。兼容性取决于 typename 的类型类别。有三个类别
类 objectexpression 的类型为 typename ,或者继承自 typename
结构 objectexpression 的类型为 typename
接口 objectexpression 实现 typename 或继承自实现 类型名称强>
专门尝试了解第3类 - 界面。
我认为在这一点上你应该真正理解为什么TypeOf varName Is varType
为True
和TextBox
显示ListBox
...
进行VBA继承时,只能使用 Implements 关键字 实现类定义。也就是说,要实现的类是 相当于C ++ / C#的抽象类:只有属性/方法 定义
通常,您的示例不是类多态的形式。当您实际派生一个类到另一个类的实例时,会发生类多态。事实并非如此。即使TextBox
和ListBox
都属于Control
类型,但它们实际上并非来自Control
类。注意:它们也可能是另一个集合的成员 - 它们是TypeOf
对象层次结构类型中的较高者(表单,也是组件和IComponent,因为表单实现了它)。