- •Объектно-ориентированное программирование
- •Часть 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;
Inherited Create;
FProp:=TAnyClass.Create; // Инициализируем поле свойства
End;
Destructor TPropClass.Destroy;
Begin
FProp.Free; // Разрушаем поле свойства
Inherited Destroy;
End;
Procedure TPropClass.SetPropObj(Obj: TAnyClass);
Begin
If Assigned(Obj) Then FProp-Assign(Obj); // Присваиваем значение полю
End;
• Объявляем переменные обоих классов и инициализируем их:
Var AnyObj: TAnyClass; // Переменная исходного класса
Obj: TPropClass; // Переменная со свойством-объектом
Begin
AnyObj :=TAnyCIass.Create;
Obj :=TPropClass.Create;
• Примеры доступа к свойству-объекту могут иметь следующий вид:
AnyObj.Fld:=Editl.Text; // Ввод значения в поле исходного объекта
Labell.Caption:=AnyObj.Fld; // Вывод введенного значения
Obj.Prop:=AnyObj; // Присвоение значения свойству Label2.Caption:=Obj.Prop.Fld; // Вывод значения поля через свойство
6.5. Команды Default, NoDefault и Stored
Эти команды называют спецификаторами хранения. Они не оказывают никакого действия на выполнение программы, но управляют способом сохранения значений свойств из раздела Published в Dfin-файле.
а) Команда Default позволяет указать значение, каким конструктор класса будет инициализировать соответствующее поле. В противном случае, как уже указывалось ранее в §2.2, оно будут инициализировано нулевым значением.
Примечания:
• Этот раздел можно указывать только для порядковых типов данных и множества. Допустим он и для данных типа указатель с единственным значением Nil, поэтому фактически нецелесообразен.
• Пункт со значением по умолчанию сам по себе не устанавливает значение свойства - ответственность за это лежит на программисте, и необходимо в конструкторе класса явно написать оператор, присваивающий свойству предусмотренное по умолчанию значение.
• Команда Default лишь информирует транслятор о том, каким значением будет инициализировано свойство. Это позволяет при считывании и записи в файлы формы и компонентов узнавать, нужно ли записывать в файл *.Dfm значение свойства. Если текущее значение свойства такое же, как в команде Default, то его можно не записывать, уменьшая таким образом размер файла.
• Свойство, определенное в разделе Published, no умолчанию всегда сохраняется в ресурсном файле.
• Для свойств-массивов команда Default объявляет соответствующее свойство-массив свойством по умолчанию, что позволяет упростить доступ к элементам такого массива. При обращении к такому свойству его имя можно не упоминать, а индекс[ы] в квадратных скобках указывать у имени объекта. Очевидно, что только одно свойство-массив класса и его потомков может иметь такую команду. В классах-потомках нельзя отметить эту команду.
Type
TAnyClass=Class // Объявление нового класса ...
// Все необходимые объявления
Property Strings[Index: Integer]: String Read GetStr Write SetStr; Default;
End;
Var AnyObject: TAnyClass; // Объявление переменной
Begin
AnyObject.Strings[l]:=='Первый и стандартный способ обращения';
AnyObject[2]:='BTOpou способ - при указании свойства Default';
End.
б) Команда NoDefault используется для сообщения о том, что не существует никакого значения, действующего по умолчанию. Обычно она применяется для наследованных свойств, которые имели заданное по умолчанию значение, и для тех же типов данных, что и команда Default.
в) Команда Stored используется для того, чтобы указать на необходимость сохранения значения свойства. За командой Stored могут стоять либо ключевые слова: True False, либо указана <переменная\метод-функция с логическим результатов. Часто используется для свойств, объявляемых в разделе Published и всегда сохраняемых в ресурсном файле.
