Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
все ответы.docx
Скачиваний:
8
Добавлен:
26.09.2019
Размер:
2.71 Mб
Скачать

18. Методы как составляющие элементы класса. Конструкторы и деструкторы.

Методы

Метод – описанная внутри класса и связанная с экземплярами класса (т.е. имеющая доступ ко всем элементам класса) процедура или функция. Совокупность методов описанных в классе (а так же и унаследованных) отражает поведение экземпляров класса.

Методы классифицируются на:

• Конструкторы (создают в памяти и/или инициализируют состояние объекта);

• Деструкторы (освобождают память и/или состояние объекта);

• Модификаторы (изменяют состояние объекта);

• Селекторы (возвращают некоторую характеристику состояния);

• Итераторы (организуют доступ к частям объекта в строго определенном порядке).

Методы – единственный вид элементов класса, у которых присутствует как декларативная (объявление), так и императивная (определение, реализация) часть. Декларативная часть находится внутри объявления класса.

Заголовки объявления методов последних трех типов по структуре не отличаются от заголовков объявлений обычных процедур и функций (за исключением специфического набора директив). Объявление конструкторов начинается с ключевого слова constructor, а объявление деструкторов с ключевого слова destructor, после которых следует имя и список параметров. Несмотря на то, что при объявлении конструктора не указывается тип возвращаемого значения, конструктор является функцией. Возвращаемое значение – экземпляр того класса, в котором описан конструктор. Деструктор и по форме описания и по использованию является процедурой.

Всем обычным методам в качестве неявного параметра (т.е. нигде не описанного) передается ссылка на сам объект, для которого вызван метод. Этот параметр называется Self. Собственно, явное его упоминание для доступа к элементам класса не обязательно, хотя возможно. Он используется либо для разрешения конфликта имен локальной переменной и элемента класса или когда методу нужно передать объект в качестве параметра куда-либо вовне класса.

Существует два способа вызова конструктора – через имя класса или через имя объекта. Между этими способами есть существенная разница: при вызове через имя класса происходит выделение памяти под объект и инициализация объекта (в том числе и тот код, что находится в реализации конструктора). При вызове через имя объекта подразумевается, что под объект уже была ранее выделена память и производится только инициализация объекта (в том числе и тот код, что находится в реализации конструктора). Хорошая практика программирования: все ресурсы, захваченные конструктором, должны быть освобождены деструктором.

Реализация методов всегда располагается в разделе implementation модуля, вне зависимости от того, где находится его объявление. От заголовка реализации обычной процедуры или функции заголовок реализации метода отличается наличием имени класса перед именем метода, отделенным точкой. А код – возможностью использовать другие элементы класса и неявный параметр Self.

Пример: пример № 1. “точка на прямой”

  • МОДУЛЬ С ОПИСАНИЕМ КЛАССА-ТОЧКИ (POINTUNIT.PAS)

UNIT PointUnit;

UNIT <имя_модуля> заголовок модуля, обязательный.

Используется для связи модуля с главной программой/другими модулями

  • Совпадает с именем файла

  • Уникальное (не повторяется внутри проекта).

INTERFACE

TYPE

// ОБЪЯВЛЕНИЕ КЛАССА- "Точка на прямой"

Point=class

private

{Координата X недоступна для объектов из других модулей}

x:Double;

public

{Определения следующих методов доступны другим объектам}

procedure setX(ax:Double); // Модификатор

function getX():Double; // Селектор

constructor Create(ax:Double); // Конструктор

destructor Kill; // Деструктор

end;

// ОБЪЯВЛЕНИЕ ОБЪЕКТА-ТОЧКИ

VAR

p:Point;

INTERFACE раздел внешних объявлений, обязательный. (интерфейсная секция, секция связи)

  • USES <список_модулей1>

Содержит имена модулей, необходимых в интерфейсной части данного модуля (при определении констант, типов, переменных параметров подпрограмм).

  • <внешние объявления>

Объявления констант/переменных/типов/заголовки подпрограмм/методов, доступных в самом модуле и за его пределами (в других модулях/программах), при подключении данного модуля.

IMPLEMENTATION

{ Point }

constructor Point.Create(ax: Double);

begin

x:=ax

end;

function Point.getX: Double;

begin

result:=x

// Возвращает значение поля X. Аналогично строке getX:=X

end;

destructor Point.Kill;

begin

// Тело деструктора пусто

end;

procedure Point.setX(ax: Double);

begin

if (ax>=0)and (ax<=100) then x:=ax

//задаем значение для поля X объекта в диапазоне [0..100]

end;

IMPLEMENTATION раздел реализации, обязательный.

  • USES <список_модулей2>

Список модулей, используемых при реализации

  • <внутренние объявления>

Реализации подпрограмм, объявленных в интерфейсной части.

Определения типов/констант/переменных/меток/подпрограмм, глобальных внутри модуля и недоступных извне.

В модуле доступны его внешние и внутренние объявления и внешние объявления других модулей, имена которых присутствуют в uses.

INITIALIZATION

{ Перед началом работы основных операторов программы создаем точку и задаем ее начальную координату. Создание объекта-точки в других модулях не требуется }

p:=point.create(10);

INITIALIZATION раздел инициализации

  • <последовательность_операторов>

Операторы, выполняемые 1 раз перед выполнением основной программы (стартовые значения переменных, одноразовые действия).

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

FINALIZATION

{По окончании работы программы удаляем объект-точку, освобождаем память, занимаемую этим объектом}

p.kill

FINALIZATION раздел завершения

  • <последовательность_операторов>

Операторы, выполняемые при завершении работы программы, например, освобождение всех элементов, назначенных в разделе инициализации.

Раздел может присутствовать только в модуле, где есть раздел initialization

Выполняется по окончании работы программы, для нескольких модулей: в порядке, обратном их перечислению в uses.

END.

END.

  • ПРИМЕЧАНИЕ. Создание/уничтожение объекта лучше осуществлять во внешних по отношению к данному модулях.

  • МОДУЛЬ ГЛАВНОЙ ФОРМЫ (MAIN.PAS)

UNIT Main;

INTERFACE

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; {необходимый для работы формы набор модулей из VCL, пополняется при добавлении компонентов на форму}

TYPE

// ОБЪЯВЛЕНИЕ КЛАССА-ФОРМЫ

TForm1 = class(TForm)

{ сюда автоматически в виде полей добавляются компоненты, размещаемые на форме, и методы-обработчики событий }

btnGetX: TButton;

Memo1: TMemo;

GroupBox1: TGroupBox;

EdtX: TEdit;

btnSetX: TButton;

BitBtnExit: TBitBtn;

Label1: TLabel;

procedure btnGetXClick(Sender: TObject);

procedure btnSetXClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

// ОБЪЯВЛЕНИЕ ОБЪЕКТА-ФОРМЫ

VAR

Form1: TForm1; { объявление объекта формы (инициализация форм происходит в файле проекта )}

IMPLEMENTATION

{$R *.dfm} // Директива включения в исполняемый файл настроек формы

uses PointUnit;

{ Подключение модуля с описанием типа "точка на прямой". Объект-точка (переменная P) создается/уничтожается в модуле PointUnit (см. его разделы Initialization и Finalization)}

// РЕАЛИЗАЦИЯ МЕТОДОВ КЛАССА TFORM1

procedure TForm1.btnGetXClick(Sender: TObject);

begin

Memo1.Lines.Add('Текущая координата:'+FloatToStr(p.getX));

// Вызов метода GetX для получения сведений о координатах точки P

end;

procedure TForm1.btnSetXClick(Sender: TObject);

begin

p.setX(StrToFloat(EdtX.Text));

// Задание новой координаты точки в пределах [0..100] - вызов метода setX

end;

END.