MS Access中VBA代码的继承

jan*_*y02 5 inheritance vba

我已经开始在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变量有两种类型-MyClassMyInterface

正如你所看到的,除了定义之外cls,没有继承任何东西MyInterface。使用时TypeOfIs它实际上显示 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 实现了这一点)。