Constructor и Destructor
Constructor и Destructor представляют собой подобие процедур, но вся их фишка в том, что их не нужно запускать вручную. Когда вы создаете объект класса, то если в классе присутствует конструктор, он автоматически запускается. Когда вы удаляете объект, то если в классе присутствует деструктор, он так же автоматически запускается. В конструкторе вы можете производить какие то вычисления, выделения дополнительной памяти, в общем любые нужные предварительные действия при инициализации объекта класса. Конечно все это можно сделать в методе класса, и вызывать метод в нужном месте, но автоматически как то более удобнее. Что касается деструктора, то он может быть полезен при очистке памяти после отработки объекта. В примере ниже объект создается в блоке Scope. Вы знаете из прошлых статей, что после своей работы блок Scope подчищает за собой, удаляя все созданные в нем переменные. А при удалении, как вы прочитали выше, автоматом запускается деструктор.
Type B As Integer W Declare Constructor () Declare Destructor () End Type Constructor B() Print "Object created" End Constructor
Destructor B() Print "Object deleted" End Destructor Scope Dim a As B End Scope Sleep
Тут все прозрачно. мы создали объект 'a' , тем самым запустили конструктор, и
поскольку никаких более действий в блоке Scope нет, он удалил переменную , тем
самым запуская деструктор.
Далее в статье под словом подкласс нужно понимать
структуру. У класса может быть множество структур, в том числе вложенных. Я их
буду называть подклассами.
Конструкторам и деструкторам не нужно указывать
своего имени. Все, что им нужно, это имя подкласса, которому они
принадлежат. В подклассе может быть много конструкторов, но только один
деструктор. Кроме того, подкласс запускает только один из конструкторов. Для
того, чтобы подкласс мог различать, какой конструктор ему запускать, у
конструкторов должны быть различны типы или кол-во параметров. Это своего рода
перегрузка конструкторов, аналогичная перегрузкам функций, о которой мы
поговорим в отдельной статье. Пример с несколькими конструкторами:
Type B As Integer W Declare Constructor (As Single) Declare Constructor (As Integer) Declare Destructor () End Type Constructor B(a As Integer) a=a*1.05 Print a End Constructor
Constructor B(f As Single) f=f*1.05 Print f End Constructor
Destructor B() Print "Object deleted" End Destructor Scope Dim a As B=B(1) Dim aa As B=B(1.5) End Scope Sleep
Честно говоря, в данном примере напрашивались дополнительные манипуляции с данными, но мне не хотелось усложнять пример. Главное не то как я умею управлять данным инструментом, а то, чтобы вам было понятнее. Посмотрите внимательнее, у нас создано два конструктора, которые работают с разными типами данных. Один работает с целыми числами, другой с дробными. Запуск их в данном случае определяется по типу параметра, передаваемого при создании объекта. Именно так в нашем примере подкласс определяет нужный конструктор для запуска. Если бы у нас были два конструктора с разным кол-ом параметров (например у одного 1, у другого 2) , то подкласс подсчитает кол-во параметров и так определит какой конструктор подойдет для запуска. Параметры для конструкторов при создании объектов, передаются после знака равно. В начале идет имя подкласса, а потом в скобках через запятую все нужные для конструкторов параметры. У деструкторов параметров быть не должно! В наших примерах, мы создавали деструкторы практически бесполезными. Придет время, мы поговорим о том как работать с памятью, и тогда я покажу в одном из примеров его значимость. В ваших программах совсем не обязательно создавать тандемом конструкторы и деструкторы, можно использовать что-то одно. Например:
Type B As Integer W Declare Destructor () End Type Destructor B() Print "End" End Destructor Sub tt() Dim a As B End Sub tt() Sleep
Подклассы можно создавать родителями, можно делать вложенными (дочерними). В примере ниже я показал использование подклассов в смешанном режиме:
Type A As Integer W Declare Constructor (As String) End Type
Type B As Integer W As A hh=A("Created") Declare Constructor () End Type Constructor A(st As String) Print "Object ";st End Constructor Constructor B() Print "object created" End Constructor Scope Dim d As B Dim g As A=A("Object Created") End Scope Sleep
В данном примере у нас класс состоит из двух подклассов A и B . При том
подкласс A является дочерним подклассом для подкласса родителя B . Каждый из них
имеет свой собственный конструктор. В случае, когда мы создаем объект на базе
подкласса B , у нас используются оба подкласса, запуская 2 конструктора. Если же
мы объект создаем на базе подкласса A , то данный подкласс сам становится
независимым родителем и запускает свой собственный конструктор. Разберите пример
последовательно в редакторе, пытаясь понять все взаимосвязи. Это сложная глава,
но следующая статья этой главы будет еще сложнее. OOП не является простым,
именно поэтому, я в одной главе сказал, что ООП выше классом чем процедурное
программирование. Не нужно переживать, если что-то непонятно, время все
расставит по местам, понимание придет, главное хотеть.
Всего доброго!
содержание | назад | вперед