- •1.Понятие жизненного цикла программного обеспечения (по). Этапы разработки по.
- •Сравнение стратегий конструирования по.
- •4. Спиральная модель жизненного цикла разработки программного обеспечения б. Боэма.
- •5.Основные приемы экстремального программирования (xp).
- •1.Короткий цикл обратной связи:
- •7. Структура оконного приложения в среде Delphi.
- •8.Модули. Структура модуля. Использование модулей в приложении
- •9.Основные типы данных языка Delphi
- •10. Структурированные типы данных. Записи. Обращение к полям записей. Оператор with. Тип "запись" (record)
- •11. Структурированные типы данных. Записи. Вариантная часть записей.
- •Описание и использование подпрограмм в языке Паскаль. Формальные и фактические параметры. Параметры-значения и параметры-переменные.
- •Описание и вызов процедур и функций
- •13. Библиотека визуальных компонентов Delphi. Назначение vcl
- •Структура vcl
- •14. Основные события Delphi. Методы обработки событий.
- •15. Объектно-ориентированный подход при разработке программы. Основные принципы объектно-ориентированного программирования.
- •16. Определение класса и объекта.
- •Примеры Классов: Класс фигур:
- •17. Атрибуты доступа к элементам класса.
- •Пример: пример “атрибуты доступа” (лекция №__)
- •Структура проекта
- •Описание классов
- •Модуль Unit1
- •Модуль Unit2
- •18. Методы как составляющие элементы класса. Конструкторы и деструкторы.
- •Пример: пример № 1. “точка на прямой”
- •19. Методы как составляющие элементы класса. Модификаторы и селекторы пример № 3. Класс “товар”
- •20. Принцип инкапсуляции. (Забавная статья, но вроде понятно)
- •21. Принцип наследования.
- •Типы наследования
- •Простое наследование
- •Множественное наследование
- •Реализация наследования на примере языка Delphi.
- •Create; begin Inherited; // Всегда вызывается в начале конструктора ... End; Иерархия стандартных классов Delphi
- •Совместимость типов для классов в иерархии наследования. Преобразование и приведение типов.
- •Совместимость объектов различных классов
- •Контроль и преобразование типов
- •Обработка исключительных ситуаций. Стандартные классы исключений на примере языка Delphi.
- •Блок try … except
- •Блок try … finally
- •Описание и обработка пользовательских исключений на примере языка Delphi.
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 раздел внешних объявлений, обязательный. (интерфейсная секция, секция связи)
Содержит имена модулей, необходимых в интерфейсной части данного модуля (при определении констант, типов, переменных параметров подпрограмм).
Объявления констант/переменных/типов/заголовки подпрограмм/методов, доступных в самом модуле и за его пределами (в других модулях/программах), при подключении данного модуля. |
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.
|
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. |