Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Служба Рассылок Городского Кота


Служба Рассылок Городского Кота
Visual Basic - Трюки и Хитрости, советы и ответы на вопросы.

Здравствуйте!
Хочу сделать достоянием общественности ответ одному из читателей, посвященный объектам , а точнее обьектным переменным:

Ты как-то делал доку по классам. А у меня возникли несколько вопросов, на которые я не могу найти ответа.

Чем отличаются строки:
    Dim aX as Abc
и
    Dim aX as New Abc
 
 
В первом случае ты создаешь обьектную переменную типа ABC , сам обьект  не создается.
пример из жизни - лежат чертежи стулал. Ты берешь бумажку , пишешь на ней - здесь будет стоять стул, сделанный по вооон тем чертежам, после чего кладешь бумажку в угол
 
Во втором случае создается инстанс обьекта. Т.е .еще одна копия обьекта. Фактичемки - новый стул по чертежам. 
 
 
В чем отличие записей
    Dim aX as New Abc
и
  Dim aX as Abc
  Set aX = New Abc
 
По результатам работы - разницы нет. Результатом является созданный обьект типа ABC
 Второй случай  - более "пристойный" Т.е. этот обьект более управляем, он может быть сброшен в nothing в любом месте "без права обжалования"  Первый же  - тоже может быть уничтожен через set aX = Nothing, но и после этого любое обрашение к методам или свойствам aX породит новцю инстанс объекта. происходить это может во всей области видимости переменной. Поэтому настоятельно рекомендую пользоваться именно декларацией с последующим присваиванием. Исключением являются короткоживущие обьекты, создаваемые и уничтожаемые внутри конкретной процедуры.
 
 
?
Зачем во втором случае вообще нужен Set? И почему его нет в первом случае?
 
А Технология такая - создается переменная ссылка ( помнишь про бумажку - "здесь будет стул")
потом (SET) этой ссылке присваивается реальный обьект . 
 
В первом случае стул создается сразу "в делеве и металле" , именно поэтому могут возьникнуть непредвиденные "возрождения" этого обьекта , даже после прямого уничтожения .
 
Далее. Если у меня класс, который не выстреливает ивенты, то его инстанс создается так:
    Dim aX as New Abc
В случае, если же класс с ивентами, то:
  Dim WithEvents aX as Abc
  Set aX = New Abc
Почему такая разница?
 
Это связано с особенностями реализации наследования в VB. Ничего не поделешь - приходится мирится.
 
 
И вот еще.
ActiveX Dll я могу почекать в референсах, потом создать инстанс и нормально юзать методы/свойства/ивенты.
А если я создаю инстанс через CreateObject(), то как потом использовать ивенты? Ведь я не могу написать строчку Dim WithEvents.
 
Нет, не можешь. Не создавай через CreateObject().  Пользуйся также ранним связыванием везде, где это возможно. Для ActiveX EXE  все можно делать аналогично. Пометить рефернесы, обьявлять обьектные переменные и присаивать им реально создаваемые обьекты.

 

 

PS. Некторого рода "уроки" по созданию обьектов я действительно пытался изложить на бумаге.
Найти их можно на моем сайте в разделе Информация

 

Успехов в программировании!

Борис Рудой

Автор сайта - Visual Basic на русском



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное