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П не является простым, именно поэтому, я в одной главе сказал, что ООП выше классом чем процедурное программирование. Не нужно переживать, если что-то непонятно, время все расставит по местам, понимание придет, главное хотеть.

 Всего доброго!

содержание | назад | вперед