我已經開始在Access中學習VBA。我讀過這種語言沒有繼承。 然後我讀了示例代碼,這似乎像它實際上有繼承:MS Access中的VBA代碼的繼承
Dim ctrl As Control
...
If TypeOf ctrl Is TextBox Then ...
If TypeOf ctrl Is ListBox Then ...
在我看來,作爲文本框,列表框是從Control繼承。有人可以解釋這一點嗎?
我已經開始在Access中學習VBA。我讀過這種語言沒有繼承。 然後我讀了示例代碼,這似乎像它實際上有繼承:MS Access中的VBA代碼的繼承
Dim ctrl As Control
...
If TypeOf ctrl Is TextBox Then ...
If TypeOf ctrl Is ListBox Then ...
在我看來,作爲文本框,列表框是從Control繼承。有人可以解釋這一點嗎?
不是。它們不是從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
結果可能會令人吃驚
True
True
cls
變量有兩種類型 - MyClass
和MyInterface
正如你所看到的cls
沒有從MyInterface
繼承任何東西,但沒有定義。當使用TypeOf
和Is
時,它實際上顯示爲真,因爲MyClass
實現了MyInterface
。不是因爲它來自MyInterface
類,而是因爲它實現了它。
現在,假設
result = TypeOf objectexpression Is typename
的TypeOf
操作員確定變量的運行時類型是否與類型名稱兼容。兼容性取決於型號類別型號名稱。有三類
類objectexpression是類型類型名的或從類型名稱繼承
結構objectexpression是類型類型名的
接口objectexpression實現類型名稱從實現類型名稱
具體地試圖理解第三類別的一類或繼承 - 接口。
我覺得在這一點上,你應該明白爲什麼TypeOf varName Is varType
顯示True
爲TextBox
和ListBox
...
當你做的VBA繼承,你只能使用器具關鍵字 實現類定義。也就是說,要實現的類是 相當於C++/C#的抽象類:只有屬性/方法 的定義。
通常,您的示例不是類多態的形式。當你真正派生一個類到另一個類的實例時,會發生類多態性。情況並非如此。儘管TextBox
和ListBox
都是Control
類型,但它們實際上並不是從Control
類派生的。注意:它們也可能是另一個集合的成員 - 它們將是對象層次結構類型中較高的那個(表單,也是Component和IComponent becuase Forms實現的)。