
- •Введение
- •Основные понятия ООП
- •Объекты и классы
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Объектная модель Object Pascal
- •Объявление класса
- •Элементы класса
- •Поля
- •Методы
- •Перекрытие методов
- •Ранее связывание
- •Позднее связывание
- •Конструкторы и деструкторы
- •Конструкторы
- •Деструкторы
- •Методы класса
- •Абстрактные методы
- •Перегрузка методов
- •Свойства
- •Свойства массивы
- •Перекрытие свойств
- •Параметр Self
- •Контроль и преобразование типов
- •Делегирование методов
- •Пример класса
- •Некоторые стандартные классы Object Pascal
- •TObject
- •TPersistent
- •TList
- •TStrings и TStringList
- •Потоковый ввод-вывод класс TStream
- •TFileStream
- •Задания к лабораторной работе
- •Вопросы к лабораторной работе
- •Справочные таблицы

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
destructor TFigure.Destroy; begin
//код для освобождения ресурсов занятых объектом
...
//вызов унаследованного деструктора inherited Destroy;
end;
Обратите внимание на то, что вызов унаследованного деструктора происходит в последнюю очередь. Иначе возможна ситуация когда ресурсы будут высвобождены до того как объект перестанет их использовать, что приведет к ошибке и краху программы.
Вызов унаследованного деструктора обязателен! В противном случае возможна утечка3
памяти или других ресурсов программы.
Обычно напрямую деструктор не вызывают. Для уничтожения объекта используется метод Free класса TObject, например
...
//основная программа var Fig:TFigure; begin
...
Fig:=TFigure.Create; //создаем объект
Fig.Show; //работа с объектом Fig.Free; //уничтожение объекта
...
end.
Деструктор вызывается в теле метода Free, причем перед вызовом деструктора метод Free проверяет, не разрушен ли объект ранее (т.е. не равен ли указатель на объект nil), а затем если объект не разрушен, разрушает его с помощью деструктора.
Методы класса
Как говорилось выше до создания объекта с помощью конструктора нельзя вызывать его методы, обращаться к полям и свойствам, но существует исключение из этого правила. Можно создавать методы к которым можно обращаться до создания объекта – это методы класса. Для объявления метода класса нужно использовать следующий синтаксис.
class procedure <имя метода>([<список форм. параметров>]); или
class function <имя метода>([<список форм. параметров>]):<тип результата>;
Как видно описание методов класса отличается от описания обычных методов только наличием зарезервированного слова class перед заголовком метода. На методы класса наложено следующее ограничение: тело метода класса не должно содержать обращений к полям, свойствам и обычным методам класса. Это ограничение естественно т.к. до создания объекта ни полей, ни обычных методов еще не существует, и обращаться просто не к чему.
3 Утечка памяти – ошибка в программе, связанная с тем, что программа выделяет динамическую память под свои нужды, а затем из-за ошибок в логике программы, не возвращает ее системе. В конце концов, это приводит к постепенному замедлению работы компьютера, а при исчерпании доступного объема памяти – краху приложения.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Методы класса используются для работы с информацией общей для всех объектов класса, например такой метод может возвращать текстовую строку с описанием назначения класса или счетчик созданных экземпляров класса. Например
type TFigure=class
private
...
public
...
class function GetClassInfo:string;
...
end;
...
function TFigure.GetClassInfo:string; begin
Result:=’Abstract class TFigure’; end;
//основная программа var Fig:TFigure; begin
...
//вызываем метод класса (до создания объекта) writeln(Fig.GetClassInfo); Fig:=TFigure.Create; //создаем объект
Fig.Show; //работа с объектом Fig.Free; //уничтожение объекта
...
end.
Абстрактные методы
Часто базовые классы содержат методы тела, которых не содержат никакого кода. Например, при реализации класса TFigure в метод Draw может не содержать никакого кода, т.к. нельзя начертить фигуру незаданной формы. Для описания таких методов необходимо применять директиву abstract. Методы с директивой abstract должны быть виртуальными и обязательно должны быть перекрыты в дочерних классах. Вызов метода объявленного с директивой abstract приведет к ошибке. Например
type TFigure=class private
...
public
...
procedure Draw; virtual; abstract; procedure Show;
end;
//дочерний класс
TDot=class(TFigure)
...
procedure Draw; override; end;
...
procedure TDot.Draw; begin

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
writeln(‘name :’, GetName, ‘x: ’, GetX,
‘y: ’, GetY);
end;
procedure TFigure.Show; begin
writeln(‘class Info’); Draw;
end;
//основная программа var Fig:TFigure;
Dot:TDot; begin
...
Fig.Show; //вызов этого метода приведет к ошибке Dot.Show; //вызов этого метода пройдет без ошибок
...
end.
Обратите внимание на то, что хотя метод TFigure.Draw объявлен, но его тело отсутствует. При вызове метода Show класса TFigure произойдет ошибка т.к. метод Draw класса TFigure, который вызывается в теле метода Show, объявлен абстрактным.
Классы, которые содержат абстрактные методы, называются абстрактными.
Перегрузка методов
Начиная с Delphi 4 в Object Pascal возможна перегрузка процедур и функций, а также методов класса. Перегрузка методов заключается в том, что можно создавать несколько одноименных методов, но с разными списками формальных параметров. Для включения механизма перегрузки методов необходимо указать директиву overload после его заголовка. Например:
type TFigure=class private
...
public
...
procedure Metod; overload;
procedure Metod(a:integer); overload; procedure Metod(a:integer; r:real); overload;
end;
...
procedure TFigure.Metod; begin
...
end;
procedure TFigure.Metod(a:integer); begin
...
end;
procedure TFigure.Metod(a:integer; r:real); begin
...
end;