2013-12-09 153 views
5

我已經開始在Access中學習VBA。我讀過這種語言沒有繼承。 然後我讀了示例代碼,這似乎像它實際上有繼承:MS Access中的VBA代碼的繼承

Dim ctrl As Control 

... 

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

在我看來,作爲文本框,列表框是從Control繼承。有人可以解釋這一點嗎?

回答

4

不是。它們不是從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操作員確定變量的運行時類型是否與類型名稱兼容。兼容性取決於型號類別型號名稱。有三類

  • objectexpression是類型類型名的或從類型名稱繼承

  • 結構objectexpression是類型類型名的

  • 接口objectexpression實現類型名稱從實現類型名稱

具體地試圖理解第三類別的一類繼承 - 接口。

我覺得在這一點上,你應該明白爲什麼TypeOf varName Is varType顯示TrueTextBoxListBox ...

當你做的VBA繼承,你只能使用器具關鍵字 實現類定義。也就是說,要實現的類是 相當於C++/C#的抽象類:只有屬性/方法 的定義。

通常,您的示例不是類多態的形式。當你真正派生一個類到另一個類的實例時,會發生類多態性。情況並非如此。儘管TextBoxListBox都是Control類型,但它們實際上並不是從Control類派生的。注意:它們也可能是另一個集合的成員 - 它們將是對象層次結構類型中較高的那個(表單,也是Component和IComponent becuase Forms實現的)。