Конструктор объектов Excel VBA и деструктор
Мне нужно сделать некоторые пользовательские объекты в VBA, которые должны будут ссылаться друг на друга, и у меня есть некоторые проблемы.
Сначала - как работают конструкторы объектов в VBA? Существуют ли конструкторы?
Во-вторых - существуют ли деструкторы? Как VBA обрабатывает конец жизненного цикла объекта? Если у меня есть объект, который ссылается на других (и это их единственная ссылка), то могу ли я установить его в Nothing и сделать с ним, или это может привести к утечкам памяти?
Этот материал квази-OO немного раздражает.
Ответы
Ответ 1
VBA поддерживает классные модули. Они имеют событие Class_Initialize, которое является конструктором, и Class_Terminate, который является деструктором. Вы можете определить свойства и методы.
Я считаю, что VBA использует подсчет ссылок для жизненного цикла объекта. Вот почему вы видите много Set any = Nothing в этом типе кода. В вашем примере я думаю, что он не будет утечки памяти. Но вам нужно быть осторожным с циркулярными ссылками.
Ответ 2
Если вы создаете модуль класса в VBA, для конструктора вы можете использовать:
Private Sub class_initialize()
....
End Sub
Нет деструкторов, так как VBA собирает мусор. Просто убедитесь, что вы очистите любые циклические ссылки, и вы должны избегать возможных утечек памяти.
Ответ 3
Прошло некоторое время с тех пор, как я их использовал, но я не думаю, что вы можете передавать параметры в конструкторы. Я думаю, что это была одна из проблем, с которыми я столкнулся, но у меня возникало множество вопросов о том, как эти классы работали и как я ожидал, что они будут работать, что я могу забыть.
Ответ 4
Существует Class_Terminate, который почти такой же, как деструктор.
Ответ 5
Я подтверждаю, что class_initialize и class_terminate.
Вы можете проверить это, написав этот 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
И напишите этот код в модуле:
Sub test()
Dim myTestClass As New TestClass
Debug.Print myTestClass.testVar
End Sub
И затем вы увидите журналы в окне отладки. Но с этим тестом мы видим, что class_initialize не вызывается при создании экземпляра (с новым), но только при первом вызове метода в экземпляре или получении значения var.
Кажется, что class_terminate вызывается в конце testModule (если экземпляр задан в этом объекте Workwork, завершение "никогда" не вызвано... возможно, только когда рабочая книга закрыта или когда Excel закрыт)