2009-02-20 17 views
22

Je dois créer des objets personnalisés dans VBA qui devront se référencer mutuellement et j'ai quelques problèmes.Constructeur et destructeur d'objet Excel VBA

Premièrement, comment les constructeurs d'objets fonctionnent-ils dans VBA? Y a-t-il des constructeurs?

Deuxièmement - y a-t-il des destructeurs? Comment VBA gère-t-il la fin du cycle de vie de l'objet? Si j'ai un objet qui référence les autres (et c'est leur seule référence), alors puis-je le définir sur Rien et en avoir fini avec lui ou pourrait-il produire des fuites même?

Cette substance quasi-OO est juste un peu irritant.

+1

Pour ajouter des variables au constructeur, voir [cette question de StackOverflow] [1]. [1]: http://stackoverflow.com/questions/15224113/pass-arguments-to-constructor-in-vba – GregNash

Répondre

21

VBA prend en charge les modules de classe. Ils ont un événement Class_Initialize qui est le constructeur et un Class_Terminate qui est le destructeur. Vous pouvez définir des propriétés et des méthodes. Je crois que VBA utilise le comptage de référence pour le cycle de vie de l'objet. C'est pourquoi vous voyez beaucoup de Set what = Nothing dans ce type de code. Dans votre exemple, je pense qu'il n'y aura aucune fuite de mémoire. Mais vous devez faire attention aux références circulaires.

16

Si vous faites un module de classe dans VBA, pour le constructeur, vous pouvez utiliser:

Private Sub class_initialize() 
.... 
End Sub 

Il n'y a pas Destructeurs, puisque VBA est détruite. Assurez-vous de nettoyer toutes les références circulaires, et vous devriez éviter toute fuite de mémoire possible.

+9

Il est pas vrai qu'il n'y a pas un destructor. C'est Class_Terminate – RubberDuck

8

Cela fait longtemps que je ne les ai pas utilisés, mais je ne pense pas que vous puissiez transmettre des paramètres aux constructeurs. Je pense que c'était l'un des problèmes que j'ai rencontrés, mais je me heurtais à tant de problèmes sur la façon dont les classes travaillaient et sur la façon dont je m'attendais à ce qu'elles fonctionnent que je me trompe peut-être.

+2

Vous avez raison. Tu ne peux pas. – Tmdean

+0

Des classes plus complexes auront souvent des fonctions de type "Start" et des variables d'état "objectStarted" pour prendre en compte le principe d'un constructeur paramétré. –

6

Il existe un Class_Terminate qui est à peu près le même que destructor.

0

J'ai confirmé que class_initialize et class_terminate.

Vous pouvez le vérifier en écrivant ce TestClass:

Public testVar As Integer 

Private Sub class_initialize() 
    Debug.Print "Class init" 
    testVar = 10 
End Sub 

Private Sub class_terminate() 
    Debug.Print "Class terminate" 
End Sub 

Et écrire ce code dans un module:

Sub test() 
    Dim myTestClass As New TestClass 
    Debug.Print myTestClass.testVar 
End Sub 

Et vous verrez les journaux dans la fenêtre de débogage. Mais avec ce test, nous pouvons voir que class_initialize n'est pas appelé lorsque vous créez l'instance (avec new) mais seulement au premier appel d'une méthode dans l'instance ou en obtenant une valeur var.

Le Class_Terminate semble être appelé à la fin de la TestModule (Si une instance est maked sur ThisWorkbook objet, fin est « jamais » appelé ... probablement seulement lorsque le classeur est fermé ou lorsque Excel est fermé)