Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.doc
Скачиваний:
8
Добавлен:
25.12.2018
Размер:
683.01 Кб
Скачать

2.1. Методы-функции и методы-процедуры

Методы-процедуры и методы-функции объявляются так же, как и обыч­ные процедуры и функции, с той лишь разницей, что это делается не в блоке объявлений программы (до главного Begin), а в описании класса.

а) Синтаксис объявления процедур и функций:

Type

<имя класса>=Class[(<имя родительского класса»)]

Procedure <имя процедуры>[(<параметры>)];

Function <имя функции>[(<параметры>)]: <тип результата>;

End;

Type TPictureShow=Class // Кинотеатр

FFilm: TFilm; // Поле косвенного доступа – фильм

FTitle: String; // Поле прямого доступа – название

Function GetFilm: TFilm;

Procedure SetFilni(Const AnFiIni: TFilm);

Function GetTitle: String;

Procedure SetTitle(AnTitle: String);

End;

б) Реализация методов.

Синтаксис реализации методов-процедур и методов-функций:

Procedure <имя класса>.<имя процедуры>[(<параметры>}];

[<блок объявлении»}

Begin

<Исполняемые операторы>

End;

Function <имя класса>.<имя функции>[(<параметры>)}:<тип результата>

[<блок объявлений>]

Begin

Исполняемые операторы> Rеsи1t:=<возвращаемое значение>;

Исполняемые операторы> End;

Function TPictureShow.GetTitle: String;

Begin

Result:=FTitle;

End;

Procedure TPictureShow.SetTitle(AnTitle: String);

Begin

FTitle:=AnTitle;

End;

Примечания:

Реализация метода начинается с указания зарезервированного слова Procedure\Function, за которым следует полное имя метода и параметры:

<имя класса>.<имя метода>[{<параметры>)];

Для метода-функции следует указать и <тип резулътата>.

Как всегда в теле функции должен быть хотя бы один оператор, при­сваивающий идентификатору функции либо предопределенной переменной Result возвращаемое значение.

Внутри метода есть доступ не только к обычным идентификато­рам, но и к полям экземпляра класса, инкапсулированным при его определе­нии, с помощью скрытого параметра Self, который передается в подпро­граммы ранее других параметров.

в) Вызов методов.

Поскольку методы присоединены к определенным классам, они не могут быть просто вызваны тем же способом, что и самостоятельные подпрограм­мы. Они могут быть активизированы только с помощью экземпляра того класса, в котором они определены. А это значит, что экземпляр класса дол­жен существовать. После того, как экземпляр создан, можно вызвать любые его методы.

Синтаксис вызова метода следующий:

<имя объекта>.<имя метода>[(<параметры>)];

Примечание:

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

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

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

Конструктор - это специальный вид подпрограммы, присоединенный к классу. Его назначение - создавать представителей (экземпляры) класса. Он ведет себя как функция, которая возвращает ссылку на вновь созданный эк­земпляр класса, т.е. на объект. Одновременно выделяется память для хране­ния значений полей экземпляра класса.

Деструктор - это специальная разновидность подпрограммы, присоеди­ненной к классу. Его назначение заключается в уничтожении экземпляра класса, т.е. объекта и освобождении памяти, выделенной под экземпляр.

а) Синтаксис объявления конструкторов и деструкторов:

Type

<имя класса>=Сlass[{Имя родительского класса>)]

. . .

Constructor Имя конструктора>[(<параметры>)]; [Override;]

Destructor <имя деструктора>[(<параметры>)}; [Override;] End;

Примечания:

Объявляются конструкторы и деструкторы, как правило, в разделе Public класса.

В классе может быть объявлено несколько конструкторов, однако чаще бывает один конструктор. Общепринятое имя для единственного кон­структора Create.

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

За объявлением деструктора по имени Destroy следует указывать ключевое слово-директиву Override, разрешающее выполнение предусмот­ренных по умолчанию действий для уничтожения экземпляра объекта, если при его создании возникла какая-либо ошибка. Фактически Override переоп­ределяет метод предка - новая начинка и старое имя.

Метод Free так же удаляет (разрушает) экземпляры класса, предва­рительно проверяя их на Nil.

Type TPictureShow=Class Public

FFilm: TFilm;

FTitle: String;

Constructor Create(AnTitle: String);

Destructor Destroy; Override;

Function GetFilm: TFilm;

Procedure SetFilm(Const AnFilm: TFilm);

Function GetTitIe: String;

Procedure SetTitle(AnTitle: String);

End;

б) Реализация конструкторов.

В задачу конструктора входит создание экземпляра класса и выполнение операторов, содержащихся в его теле. Заботиться о деталях того, как именно при работе программы в памяти будет создан новый экземпляр класса, нет необходимости. К моменту выполнения операторов конструктора он будет создан автоматически и назначение кода внутри конструктора - инициализи­ровать только что созданный экземпляр объекта. Синтаксис реализации кон­структора:

Constructor <имя класса>.<имя конструктора>[(<параметры>}};

[<блок объявлений>}

Begin

<Исполняемые операторы>

End;

в) Реализация наследуемых конструкторов.

Constructor <имя класса>.<имя конструктора>[(<параметры>)];

[<блок обьявлений>}

Begin

Inherited <имя конструктора>[(<параметры>)};

<инициализация собственных полей>

End;

Constructor TPictureShow.Create(AnTitle: String);

Begin