我正在学习Access中的VBA。我读到这种语言没有继承。
但是,我看到一个示例代码,它似乎实际上具有继承:
Dim ctrl As Control
...
If TypeOf ctrl Is TextBox Then ...
If TypeOf ctrl Is ListBox Then ...
似乎文本框(TextBox)和列表框(ListBox)都是从控件(Control)继承而来。有人能解释一下吗?
我正在学习Access中的VBA。我读到这种语言没有继承。
但是,我看到一个示例代码,它似乎实际上具有继承:
Dim ctrl As Control
...
If TypeOf ctrl Is TextBox Then ...
If TypeOf ctrl Is ListBox Then ...
Control
类派生的。它们实现了Control
的定义/方法和属性签名。 TypeOf
和Is
运算符的工作方式是检查一个类的实例是否实现了以下3个类别之一(列在下面)。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
True
True
cls
变量有两种类型 - MyClass
和MyInterface
正如您所看到的,cls
没有从MyInterface
继承任何内容,只有定义。当使用TypeOf
和Is
时,它实际上显示为真,因为MyClass
实现了MyInterface
。这并不是因为它派生自MyInterface
类,而是因为它实现了它。
现在,假设
result = TypeOf objectexpression Is typename
TypeOf
运算符用于确定变量的运行时类型与给定类型typename是否兼容。兼容性基于类型类别,有三个类别:
类(Class) objectexpression是类型typename或者继承自类型typename
结构体(Structure) objectexpression是类型typename
接口(Interface) objectexpression实现了类型typename或者继承自实现类型typename的类
需要特别理解第三个类别 - 接口(Interface).
我认为此时您应该真正理解为什么TypeOf varName Is varType
对于TextBox
和ListBox
显示True
...
在进行VBA继承时,只能使用Implements关键字来实现一个类的定义。也就是说,要实现的类相当于C++/C#的抽象类:只具有属性/方法定义。
一般而言,您的示例不是类多态的形式。类多态是指实际上将一个类的实例派生到另一个类。这种情况并不适用。尽管TextBox
和ListBox
都属于Control
类型,但它们并不是从Control
类派生而来。注:它们也可能是另一个集合的成员 - 它们将是对象层次结构类型(包括Forms、Component和IComponent,因为Forms实现了它们)。