在MS Access中,针对VBA代码的继承

5

我正在学习Access中的VBA。我读到这种语言没有继承。

但是,我看到一个示例代码,它似乎实际上具有继承:

Dim ctrl As Control

...

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

似乎文本框(TextBox)和列表框(ListBox)都是从控件(Control)继承而来。有人能解释一下吗?
1个回答

5
不,它们不是从Control类派生的。它们实现了Control的定义/方法和属性签名。 TypeOfIs运算符的工作方式是检查一个类的实例是否实现了以下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

结果可能会令人惊讶。
True
True

cls变量有两种类型 - MyClassMyInterface

正如您所看到的,cls没有从MyInterface继承任何内容,只有定义。当使用TypeOfIs时,它实际上显示为真,因为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对于TextBoxListBox显示True...

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

一般而言,您的示例不是类多态的形式。类多态是指实际上将一个类的实例派生到另一个类。这种情况并不适用。尽管TextBoxListBox都属于Control类型,但它们并不是从Control类派生而来。注:它们也可能是另一个集合的成员 - 它们将是对象层次结构类型(包括Forms、Component和IComponent,因为Forms实现了它们)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接