MS Access中VBA代码的继承

时间:2013-12-09 10:10:16

标签: vba inheritance

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

Dim ctrl As Control

...

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

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

1 个答案:

答案 0 :(得分:4)

没有。它们不是来自Control类。他们实现Control的定义/方法和属性签名。 TypeOfIs运算符的工作方式是检查类的实例是否实现了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变量有两种类型 - MyClassMyInterface

正如您所看到的,cls不会从MyInterface继承任何内容,而是定义。使用TypeOfIs时,它实际上显示为true,因为MyClass实现了MyInterface。不是因为它来自MyInterface类,而是因为它实现它。

现在,假设

result = TypeOf objectexpression Is typename

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

  • objectexpression 的类型为 typename ,或者继承自 typename

  • 结构 objectexpression 的类型为 typename

  • 接口 objectexpression 实现 typename 继承自实现 类型名称

专门尝试了解第3类 - 界面。

我认为在这一点上你应该真正理解为什么TypeOf varName Is varTypeTrueTextBox显示ListBox ...

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

通常,您的示例不是类多态的形式。当您实际派生一个类到另一个类的实例时,会发生类多态。事实并非如此。即使TextBoxListBox都属于Control类型,但它们实际上并非来自Control类。注意:它们也可能是另一个集合的成员 - 它们是TypeOf对象层次结构类型中的较高者(表单,也是组件和IComponent,因为表单实现了它)。