2013-12-09 20 views
5

Ho iniziato a imparare VBA in Access. Ho letto che la lingua non ha ereditarietà. E poi ho letto un codice di esempio che sembra in realtà ha di successione:Ereditarietà per codice VBA in MS Access

Dim ctrl As Control 

... 

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

Mi sembra come il TextBox, ListBox furono ereditati dal controllo. Qualcuno potrebbe spiegarlo?

risposta

4

No. Non sono derivati ​​dalla classe Control. Implementano la definizione/i metodi e le firme delle proprietà di Control. Gli operatori TypeOf e Is lavorano sono controllano se l'istanza di una classe implementa una delle 3 categorie (elencate di seguito).

aprire una cartella di lavoro nuova

Vai a VBE e aggiungere

un modulo di classe e denominarlo: MyClass

nella visualizzazione solo codice aggiungere Implements MyInterface

un modulo di classe e denominarlo: MyInterface

nella visualizzazione di codice - non fanno nulla/lasciare vuoto

un modulo e copia incolla il codice qui sotto ed eseguirlo

Sub Main() 

    Dim cls As MyClass 
    Set cls = New MyClass 

    Debug.Print TypeOf cls Is MyClass 
    Debug.Print TypeOf cls Is MyInterface 

End Sub 

Il risultato può essere sorprendente

True 
True 

cls variabile è di due tipi - MyClass e MyInterface

come si può vedere cls non eredita nulla MyInterface ma la definizione. Quando si utilizza TypeOf e Is in realtà è vero perché MyClass implementa MyInterface. Non perché è derivato dalla classe MyInterface ma perché è implementa.

Ora, supponiamo

result = TypeOf objectexpression Is typename 

L'operatore TypeOf determina se il tipo di runtime di variabile è compatibile con typename. La compatibilità dipende dalla categoria di tipo typename.Ci sono tre categorie

  • Classeobjectexpression è di tipo typename o eredita da typename

  • Strutturaobjectexpression è di tipo typename

  • interfacciaobjectexpression implementa typename o eredita da una classe che implementatypename

In particolare cercare di capire il 3 ° categoria - Interface.

Credo che a questo punto si dovrebbe davvero capire perché TypeOf varName Is varType mostra True per la TextBox e ListBox ...

Quando si esegue l'ereditarietà VBA, è possibile utilizzare solo Implementa parola chiave per implementa una classe definizione. Cioè, la classe da implementare è equivalente alla classe astratta di C++/C#: ha solo la proprietà/metodo definizione.

Generalmente, il tuo esempio non è una forma di un polimorfismo di classe. Il polimorfismo di classe si verifica quando si sta effettivamente derivando un'istanza da uno a un altro. Questo non è il caso. Anche se TextBox e ListBox sono entrambi di tipo Control, in realtà non derivano dalla classe Control. Nota: possono anche essere membri di un'altra raccolta - sarebbero TypeOf più in alto nel tipo di gerarchia oggetto (moduli, anche Componente e IComponente perché le Forme implementano quello).

Problemi correlati