- •Объектно-ориентированное программирование
- •Часть 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;
Var aLine: tLine;
Begin
. . .
ALine:=TLine.Create; // На самом деле ALine всего лишь ссылка
. . .
• Обратимся к полям (атрибутам) экземпляра:
. . .
ALine.X:=10;
ALine.Y:=10;
ALine.Length:=100;
ALine.Angle:=30; // Пока все аналогично полям записи
• Объявим новый класс (класс-потомок) от созданного класса:
Type
TColorLine=Class(TLine)
Color: TColor; // Дополнительное поле - цвет линии
Width: Integer; // Дополнительное поле - ширина линии
Constructor Create; // Новый конструктор
End;
• Объявим экземпляр этого класса и обратимся к нему:
Var aColorLine: tColorLine;
Begin
AColorLine:=TColorLine.Create;
AColorLine.Color:=clRed;
AColorLine.Width:=2;
ACoIorLine.X:=20; // Есть отличие доступа от записи
AColorLine.Y:=20
Таким образом, при объявлении класса TColorLine не требуется указывать напрямую поля, наследуемые от класса TLine, как это требовалось бы при использовании вложенных записей.
2. Методы
Метод - это подпрограмма, которая определена как часть класса и включена в описание этого класса. Набор всех методов определяет операции, которые могут быть выполнены над экземпляром класса. Методы снабжают экземпляры класса поведением и определяют протокол (способ вызова), посредством которого это поведение можно активизировать. Всего существует шесть разновидностей методов объектов:
• методы-процедуры, которые аналогичны самостоятельным процедурам, за исключением того, что они "присоединены" к тому классу, в котором заданы, и могут быть вызваны лишь через какой-либо активный экземпляр этого класса;
• методы-функции, которые возвращают значения и ведут себя так же, как и обычные самостоятельные функции, с той лишь разницей, которая указана для методов-процедур;
• классовые процедуры, которые концептуально даже ближе к обычным самостоятельным процедурам, чем методы-процедуры. Для вызова классовых процедур не требуется экземпляр класса. Эти процедуры объявляются как часть класса и могут вызываться с использованием ссылки на сам класс (т.е. тип), а не на его экземпляр;
• классовые функции, которые аналогичны классовым процедурам, но возвращают результат;
• конструкторы - это специальные методы, ведущие себя аналогично классовым функциям. Они также вызываются с помощью ссылки на класс, в котором они заданы, и возвращают значение, которое является ссылкой на вновь созданного представителя этого класса. Таким образом и создаются экземпляры классов - путем вызова конструктора соответствующего класса;
• деструкторы - это также специальные методы объекта, похожие на методы-процедуры. Они точно также вызываются, как и они, т.е. необходимо использовать экземпляр класса. Предназначены деструкторы для уничтожения экземпляров класса.
Примечания:
• Все методы описываются в программе дважды:
• первоначально в объявлении класса располагается (как правило, в интерфейсе модуля) объявление метода, которое служит для того, чтобы сообщить компилятору о намерении создать метод. Это подобно объявлению Forward для обычных процедур и функций;
• тело метода размещается вне объявления класса - в разделе реализации (Implementation) того же модуля, либо в программе или в библиотеке, до основного блока Begin End.
• Внутри одного класса можно объявить столько методов, сколько
требуется.
• Внутри методов можно обращаться к методам предков, используя
конструкцию:
[Self.]<имя метода>[(<параметры>)];
• При объявлении методы разных видов могут быть перемешаны между собой.
• Объявления методов могут быть сгруппированы в разделы, важно лишь, чтобы в пределах каждого раздела в описании класса все поля объявлялись до объявления методов.
• За именем метода может следовать заключенный в скобки необязательный список параметров, синтаксис написания которого аналогичен
обычным подпрограммам.
• Базовый класс TObject включает до 25 (Delphi 5) различных методов:
конструктор, деструктор, метод Free, 9 классовых методов и не имеет полей данных и свойств.
• По умолчанию все методы являются статическими. При объявлении метода может быть использовано несколько команд (слов-директив), конкретизирующих вариант вызова метода: Class, Virtual, Dynamic, Abstract, Override, Overload, Reintroduce, Message.
» В Delphi 4.0 в класс TObject введены два виртуальных метода AfterConstruction и BeforeDestruction, которые можно использовать тогда, когда конструктора и деструктора недостаточно.