gpt4 book ai didi

vba - MS Access 中 VBA 代码的继承

转载 作者:行者123 更新时间:2023-12-03 03:45:39 25 4
gpt4 key购买 nike

我已经开始学习 Access 中的 VBA。我读到语言没有继承性。然后我读了一个示例代码,看起来它实际上具有继承:

Dim ctrl As Control

...

If TypeOf ctrl Is TextBox Then ...
If TypeOf ctrl Is ListBox Then ...

在我看来,TextBox、ListBox 都是从 Control 继承的。有人能解释一下吗?

最佳答案

没有。它们并非源自 Control类(class)。他们实现Control的定义/方法和属性签名。方式TypeOfIs运算符的工作原理是检查类的实例是否实现 3 个类别之一(如下所列)。

打开工作簿

转到 VBE 并添加

一个类模块并将其命名为:MyClass

在代码 View 中只添加Implements MyInterface

一个类模块并将其命名为:MyInterface

在代码 View 中 - 什么都不做/留空

一个模块并复制粘贴以下代码并运行它

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变量有两种类型 - MyClassMyInterface

如您所见cls不从 MyInterface 继承任何内容但定义。使用时TypeOfIs它实际上显示为 true 因为 MyClass实现MyInterface 。不是因为它源自 MyInterface类,但因为它实现它。

现在,假设

result = TypeOf objectexpression Is typename

TypeOf运算符确定变量的运行时类型是否与typename兼容。兼容性取决于typename的类型类别。共有三类

  • Class objectexpression 属于 typename 类型或继承于 typename

    <
  • 结构 objectexpression 属于类型 typename

  • 接口(interface) 对象表达式实现类型名称从实现的类继承类型名称

特别尝试了解第三类 - 接口(interface)。

我想此时你应该真正明白为什么 TypeOf varName Is varType显示True对于TextBoxListBox ...

当你进行VBA继承时,你只能使用Implements关键字来实现类定义。也就是说要实现的类是相当于C++/C#的抽象类:只有属性/方法定义。

通常,您的示例不是类多态性的一种形式。当您实际派生一个实例以将其类化为另一个实例时,就会发生类多态性。事实并非如此。即使TextBoxListBox都是Control它们实际上并非源自 Control 类型类(class)。注意:它们也可能是另一个集合的成员 - 它们将是 TypeOf对象层次结构类型中的较高者(表单,还有 Component 和 IComponent,因为 Forms 实现了它们)。

关于vba - MS Access 中 VBA 代码的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20467903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com