- •Объектно-ориентированное программирование
- •Часть 1 классы и объекты
- •Введение
- •1. Классы и объекты
- •Var aLine: tLine;
- •Var aColorLine: tColorLine;
- •2. Методы
- •2.1. Методы-функции и методы-процедуры
- •2.2. Конструкторы и деструкторы
- •Inherited Create;
- •Var TmpFrm: tForm;
- •Var Mem: tMemo;
- •2.3. Классовые процедуры и функции
- •Var s: String;
- •2.4. Скрытый Self
- •3. Видимость компонентов класса
- •4. Наследование
- •4.1. Основные понятия
- •4.2. Наследование полей
- •4.3. Поведение методов при наследовании
- •Var SomeObject: t1;
- •Virtual;
- •Virtual; Abstract;
- •4.4. Иерархия классов
- •4.5. Rtti
- •4.6. Проверка типа
- •4.7. Приведение типа
- •4.8. Указатели на класс
- •Var ObjRef: tObjRef;
- •Implementation
- •X, y, w, h: Integer): tControl;
- •5. Полиморфизм
- •6. Свойства (properties)
- •6.1. Объявление свойств
- •6.2. Объявления свойств-массивов
- •Var I: Byte;
- •6.3. Раздел Read
- •6.4. Раздел Write
- •Inherited Create;
- •Inherited Destroy;
- •6.5. Команды Default, NoDefault и Stored
- •6.6. Команда Index
- •Var aYear, aMonth, aDay: Word;
- •Var aYear, aMonth, aDay: Word;
- •6.7. Команды DispId и Implements
- •6.8. Переопределение свойств при наследовании
- •7. События (events)
- •7.1. Объявление событий
- •IfAssigned(fOnMouseMove) Then fOnMouseMove(Self, Shift, X, y);
- •Vk_return: NumMemo.DoNumStr(l);
- •Vk_return: PostMessage(NumMemo.Handle, wm_user1,1, 0);
- •7.2. Обработчики событий
- •7.3. Делегирование событий
- •Var Objl: tIstClass;
- •7.4. Переопределение стандартных событий
- •Var NewBtn: tNewButton;
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