Конструкторы и деструкторы

 

В состав класса входят два специальных метода конструктор (constructor) и деструктор(Destructor).В Delphi конструктор принято называть Create() а деструктор – Destroy(). Create выделяет динамическую память для объекта (размещаются поля объекта), а Destroy() освобождает динамическую память.

 

Type

TMyClass= class

FIntField: Integer;

Constructor Create(Value:Integer);

Destructor Destroy;

End;

Любые поля, а также методы класса, оперирующие его полями, могут вызываться только после создания объекта вызовом конструктора.

Var

MyObject: TMyClass;

Begin

MyObject.FIntField := 0; //Ошибка. Объект не создан

//Конструктор работает как функция, возвращающая адрес объекта

MyObject := TMyClass.Create; //Верно. Создаем объект

MyObject.FIntField := 0; // обращаемся к его полю

 

MyObject.Free; // уничтожаем объект

End;

В базовом классе TObject определен метод Free, который проверяет действительность адреса объекта и затем вызывает деструктор Destroy.

If Self<>Nil then Destroy;

Специальная ссылка self всегда указывает текущий объект.

В модуле System определена процедура FreeAndNil, которая не только уничтожает объект, но устанавливает его

указатель в значение Nil.

FreeAndNil(MyObject);

В конструкторе классе потомка следует сначала вызвать конструктор его родителя, и затем осуществить дополнительные действия. Вызов любого метода родительского класса достигается с помощью зарезервированного слова inherited(унаследованный)

Constructor TMyClass.Create(AOwner:TComponent;Value:integer);

// возможная реализация конструктора

Begin

Inherited Crete(Aowner:TComponent);//вызываем унаследованный конструктор

intField:=Value;//реализуем дополнительные действия

End;

 

Перегружаемые методы

В классах могут содержаться методы с одинаковыми именами , но с разными параметрами. Компилятор определяет, какой метод использовать в зависимости от типов его параметов.

Перегрузка методов обеспечивается директивойOverload. Пример

Type

T1=class(TObject)

Procedure Sum(X,Y:Integer);overload;

End;

T2=class(T1)

Procedure Sum(X,Y:Real);overload;

End;

Var Ct:T2;

Begin

Ct:=T2.Creat;

Ct.Sum(2,2); //вызывается T1.sum()

Ct.Sum(2.0,2.0);// вызывается T2.sum()

End;

Перегружаемым может быть и виртуальный метод для этого в наследуемом методе дополнительно указать ключевое слово reintroduce.

Type

T1=class(TObject)

Procedure Sum(X,Y:Integer);overload; virtual;

End;

T2=class(T1)

Procedure Sum(X,Y:Real);reintroduce; overload;

End;

Некоторые методы могут вызываться без создания и инициализации объекта. Такие методы называются методами класса, они объявляются с помощью зарезервированного слова class.

Type

TMyclass=class(TObject)

Class Function GetClassName:String;

End;

Var

S:String;

Begin

S:=TMyClass.GetClassName;

End;

Свойства

Свойства –это специальные атрибуты классов, регулирующие доступ к полям. Свойства объявляются с помощью зарезервированных слов Property, read и write(слова read и write считаются зарезервированными только в контексте объявления свойства). Обычно связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи а это поле или при чтении из него. Например

 

Type

TaClass=Class

IntField:Integer;

Function GetField:integer;

Procedure SetField( Value:integer);

Property IntegrValue:integer read GetField write SetFeild;

End;

В контексте программы свойство ведег себя как обычное поле. Например, можно

написать такие операторы

var

aclass:Taclass;

Value:integer;

Begin

Aclass := Taclass.Create;// Обязательное обращение к конструктору перед обращением

// к полю или свойству

Aclass.IntegerValue:=0;

Value := aclass.IntegerValue;

Aclass.Destroy;// Удаление ненужного объекта

End;

Если необходимо, чтобы свойство было доступно только для чтения или только для записи, следует опустить соответственно части write или read.

Объявление класса

Любой вновь создаваемый класс может содержать разделы, определяемые зарезервированными словами published (публикуемые), private(закрытые), protected(защищенные), public(доступные), automated(автоматизированные).

Внутри каждого раздела вначале определяются поля, а затем методы и свойства.

Эти разделы определяют области видимости членов класса. Раздел public не накладывает ограничений на область видимости, перечисляемые в нем члены класса можно вызвать в другом модуле. Раздел published не ограничивает область видимости, она доступна в окне инспектор объектов. Раздел privateдоступен только внутри методов данного класса и, подпрограммах, находящихся в том же модуле, где описан класс. Раздел Protected доступен методам самого класса и его потомкам независимо от их месторасположения.

Type

TForm =class(TForm)

Button1:Tbutton;// доступна всей среде

Private// доступна в модуле объявления этого класса

FintField:integer;

Procedure SetValue(Value:Integer);

FunctionGetValue:integer;

Published// доступна в любом модуле

Property intField read GetValue write SetValue

Protected//доступна только методам самого классам и потомкам

// не зависимо от их места расположения

Procedure Proc1;

Public // доступна в любом модуле

Procedure Proc2;

End;