Подтвердить что ты не робот

Конструктор объектов Excel VBA и деструктор

Мне нужно сделать некоторые пользовательские объекты в VBA, которые должны будут ссылаться друг на друга, и у меня есть некоторые проблемы.

Сначала - как работают конструкторы объектов в VBA? Существуют ли конструкторы?

Во-вторых - существуют ли деструкторы? Как VBA обрабатывает конец жизненного цикла объекта? Если у меня есть объект, который ссылается на других (и это их единственная ссылка), то могу ли я установить его в Nothing и сделать с ним, или это может привести к утечкам памяти?

Этот материал квази-OO немного раздражает.

4b9b3361

Ответ 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 закрыт)