что-то я в форумном "море впр-ов" поглупел кто знает - подскажите, плиз. как в VBA в модуле класса реализовать конструктор и деструктор? автоматически вызываемые при создании и уничтожении экземпляра класса. через "обычные" методы класса - неспортивно как-то. да и неудобно.
спасибо.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Саш, это всё на "серьёзных" языках. я понимаю - в VBA многого из ООП нет. даже ООП 15-20-летней давности. что уж о паттернах говорить.
я много не прошу мне нужны всего лишь конструктор и деструктор. и мне кажется, что где-то когда-то я встречал что-то подобное. именно для VBA. но сейчас никак не могу нагуглить.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Код стандартного модуля. Сначала выполнить Test1, а затем – Test2
Код
' Код стандартного модуля Module1
Dim x As Class1
' Выполнить сначала это
Sub Test1()
Set x = New Class1
End Sub
' А затем - это
Sub Test2()
Set x = Nothing
End Sub
Код модуля класса Class1
Код
' Код модуля класса Class1
' Конструктор класса по умолчанию
Private Sub Class_Initialize()
MsgBox "Class_Initialize"
End Sub
' Деструктор класса по умолчанию
Private Sub Class_Terminate()
MsgBox "Class_Terminate"
End Sub
Откуда это берётся: после добавления модуля класса, например, Class1 внутри этого модуля вверху есть 2 комбобокса. В левом комбобоксе по умолчанию написано (General), там нужно выбрать строку ниже, где написано Class. Затем заглянуть в правый комбобокс, там и обнаружатся 2 строки: Initialize и Terminate. При выборе любого из них автоматически создается заготовка кода.
Насколько я понял, нужен такой конструктор, который инициализировал бы переменные класса во время создания объекта на основе передаваемых параметров в конструктор? К сожалению, в VBA такого нет. Только пустой конструктор. Можно лишь создать дополнительно процедуры, которые эмулировали бы такой конструктор, но это будет уже после создания объекта. Например:
Класс Student
Код
Private m_Id As Long
Private m_Name As String
Sub InitializeData(Id As Long, Name As String)
m_Id = Id
m_Name = Name
End Sub
Property Get Id() As Long
Id = m_Id
End Property
Property Get Name() As String
Name = m_Name
End Property
Стандартный модуль:
Код
Sub TestClass()
Dim st As Student
' Здесь запускается процедура Class_Initialize
Set st = New Student
' Инициализация данных
st.InitializeData Id:=1, Name:="Johny"
MsgBox "Id: " & st.Id & ", Name: " & st.Name
End Sub
Владимир (ZVI), спасибо, по приведенным ссылкам я такой пример конструктора встретил, но Вы, как всегда, расписали всё чётко по полочкам!
Johny, да, отсутствие конструкторов с параметрами в VBA (а уж тем более нескольких конструкторов для одного класса) - это, конечно, существенный недостаток. но всё-таки хоть что-то. буду думать, как использовать то, что есть.
пс. вчера (точнее - сегодня ночью) я что-то нашёл про интерфейсы для классов... но всё на буржуйском и голова соображала плохо. пока положил в заначку.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
ikki пишет: пс. вчера (точнее - сегодня ночью) я что-то нашёл про интерфейсы для классов...
А причём тут интерфейс и конструктор? Вот применение интерфейса:
Класс интерфейса Student:
Код
Option Explicit
Property Get Id() As Long
End Property
Property Get Name() As String
End Property
Sub ShowData()
End Sub
Sub InitializeData(Id As Long, Name As String)
End Sub
Класс Teacher, который применит интерфейс Student:
Код
Implements Student
Private m_Id As Long
Private m_Name As String
Property Get Student_Id() As Long
Student_Id = m_Id
End Property
Property Get Student_Name() As String
Student_Name = m_Name
End Property
Sub Student_InitializeData(Id As Long, Name As String)
m_Id = Id
m_Name = Name
End Sub
Sub Student_ShowData()
MsgBox "Id: " & Student_Id & ", Name: " & Student_Name
End Sub
И тестовая процедура:
Код
Sub TestInterface()
Dim intf As Student
Set intf = New Teacher
intf.InitializeData 1, "ikki"
MsgBox "Id: " & intf.Id & ", Name: " & intf.Name
End Sub
Johny пишет: Я так понял "а бы чего сказать"... Javascript - не VBA. В нём прототипов нет.
я это знаю
Цитата
nerv пишет: init terminate
Цитата
ZVI пишет:
Код
' Код модуля класса Class1' Конструктор класса по умолчанию
Private Sub Class_Initialize()
MsgBox "Class_Initialize"
End Sub
' Деструктор класса по умолчанию
Private Sub Class_Terminate()
MsgBox "Class_Terminate"
End Sub
Цитата
nerv пишет: конструктор - модуль класса, уничтожение set obj = nothing, не?
Цитата
ZVI пишет:
Код
' Код стандартного модуля Module1
Dim x As Class1
' Выполнить сначала это
Sub Test1()
Set x = New Class1
End Sub
' А затем - это
Sub Test2()
Set x = Nothing
End Sub
UPD ikki, если хочешь создавать объекты с произволными полями на лету, можешь использовать это.
Вот пример полезного использования интерфейса. На основе UserForm создал ProgressBar. Идея состоит в том, что с помощью интерфейса мы отфильтровываем все остальные свойства UserForm'ы (их можно добавить опять же с помощью интерфейса, если нужно). При этом IntelliSense показывает нам только те методы, которые нужны при работе с ProgressBar: