Страницы: 1
RSS
VBA. Конструктор и деструктор класса, ООП на марше
 
что-то я в форумном "море впр-ов" поглупел  :(
кто знает - подскажите, плиз.
как в VBA в модуле класса реализовать конструктор и деструктор?
автоматически вызываемые при создании и уничтожении экземпляра класса.
через "обычные" методы класса - неспортивно как-то.
да и неудобно.

спасибо.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
init
terminate

UPD а вообще не понял, что именно нужно
Изменено: nerv - 15.01.2013 21:45:36
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
это не то.
или "не оттуда".
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
конструктор - модуль класса, уничтожение set obj = nothing, не?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
ну например.
есть у меня мой класс в отдельном модуле класса myClass
в стандартном модуле я создаю экземпляр
Код
dim myObj as New myClass


как мне сделать, чтобы при этом автоматически вызывались какие-то процедуры для вновь созданного объекта?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
для каждого объекта свои процедуры?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
ну да. типа инициализации.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
есть такой шаблон проектирования, называется фабрика (объектов) или я тебя не понял
Изменено: nerv - 15.01.2013 22:02:18
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Саш,  это всё на "серьёзных" языках.
я понимаю - в VBA многого из ООП нет. даже ООП 15-20-летней давности.
что уж о паттернах говорить.

я много не прошу  :D
мне нужны всего лишь конструктор и деструктор.
и мне кажется, что где-то когда-то я встречал что-то подобное.
именно для VBA.
но сейчас никак не могу нагуглить.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
что в твоем понимании конструктор?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
и не только в моём.
вот это: конструктор
согласен на неперегружаемый вариант  :D
Изменено: ikki - 15.01.2013 22:21:09
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ikki пишет: но сейчас никак не могу нагуглить
руки кривые потому что.
хоть что-то
ушёл переваривать.

Саш, давай пока притормозим?
Изменено: ikki - 15.01.2013 22:34:46
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ok, переформулирую: что в твоем понимании конструктор в VBA?

к сведению: в js любая функция может быть конструктором (если она вызывается с new)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
кажется, нашёл
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Чтобы в 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.
При выборе любого из них автоматически создается заготовка кода.
Изменено: ZVI - 16.01.2013 08:53:12
 
Насколько я понял, нужен такой конструктор, который инициализировал бы переменные класса во время создания объекта на основе передаваемых параметров в конструктор?
К сожалению, в 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
Изменено: Johny - 16.01.2013 10:32:37
There is no knowledge that is not power
 
Цитата
nerv пишет:
init
terminate

Я так понял "а бы чего сказать"... Javascript - не VBA. В нём прототипов нет. :D
Изменено: Johny - 16.01.2013 10:53:22
There is no knowledge that is not power
 
С.М., спасибо за пример.

Владимир (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
There is no knowledge that is not power
 
куда я залез?!!  :o  :D
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Johny пишет:
Я так понял "а бы чего сказать"... Javascript - не VBA. В нём прототипов нет.  :D  
я это знаю
Цитата
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, если хочешь создавать объекты с произволными полями на лету, можешь использовать это.
Изменено: nerv - 16.01.2013 12:40:00
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Вот пример полезного использования интерфейса. На основе UserForm создал ProgressBar. Идея состоит в том, что с помощью интерфейса мы отфильтровываем все остальные свойства UserForm'ы (их можно добавить опять же с помощью интерфейса, если нужно). При этом IntelliSense показывает нам только те методы, которые нужны при работе с ProgressBar:
There is no knowledge that is not power
 
о! спасибо.
будет что почитать в выходные  :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Решил внести и свои пять копеек - перевел статью Дэвида Хоровица (но не могу добавить!!!)

Архивы не хочет загружать, размер Веб-страницы более 450КБ!
Страницы: 1
Читают тему
Наверх