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. Некторого рода "уроки" по созданию обьектов я действительно
пытался изложить на бумаге.
Найти их можно на моем сайте в разделе Информация