- •Объектно-ориентированное программирование
- •Часть 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;
4.6. Проверка типа
Оператор Is предназначен для проверки совместимости по присвоению экземпляра какого-нибудь класса с заданным классом. Выражение вида:
If AnObject Is TClassType Then TClassType(AnObject).<метод>;
приводит к выполнению <метода> класса TClassType тогда, когда выражение AnObject Is TClassType принимает значение True. А это происходит только в том случае, если объект AnObject совместим по присвоению с классом TClassType, т.е. является экземпляром этого класса или одного из порожденных от него классов-потомков.
4.7. Приведение типа
Приведение типа значения (value typecasting) - это операция изменения типа выражения на какой-либо другой. Оба типа - и тип выражения, и результирующий - должны быть или порядковыми типами, или указателями.
Оператор As введен в язык специально для приведения объектных типов. С его помощью можно рассматривать экземпляр класса одного типа как принадлежащий другому, но совместимому типу. Этот оператор проверяет типы переменных во время выполнения программы, после чего выполняет безопасное приведение типа. Так конструкция:
With ASomeType As TAnotherType Do...
приводит к тому, что сам экземпляр остается неизменным, однако вызываются те методы, как если бы он принадлежал к присваиваемому типу. Для несовместимых типов эта операция приводит к возбуждению исключения EInvalidCast.
Чаще всего оператор As применяется для выполнения определенных действий над параметром Sender, например, для безопасного приведения параметра Sender к конкретному типу:
(Sender As TControl).Visible:=True;
Напомним, что стандартный (неявный) способ приведения типа выглядит как:
With TAnotherType(ASoineType) Do...
От стандартного способа приведения типов использование оператора As отличается наличием проверки на совместимость типов во время выполнения операции приведения типа. Очень полезным может быть использование этого оператора в методах-обработчиках событий. Для обеспечения совместимости источник событий Sender имеет тип TObject, хотя ясно, что реально им может быть форма или любые другие компоненты.
Паскалевская форма приведения типа также допустима, но менее надежна из-за отсутствия проверки на совместимость типов.
Такой подход позволяет расширить класс путем придания необходимого поведения другому классу, вместо того, чтобы создавать класс-потомок и перекрывающие методы. Таким образом, замедляется разрастание иерархии классов, однако, не следует использовать эти методы вместо полиморфизма, ибо они замедляют программы, поскольку для проверки совместимости типов в ряде случаев нужно будет проходить по иерархии классов.
4.8. Указатели на класс
Информация в RTTI "живет самостоятельной жизнью" и может использоваться без создания экземпляра класса. Доступ к RTTI класса вне методов класса можно получить, описав соответствующий указатель, называемый указателем (ссылкой) на класс или указателем на объектный тип (Class reference). Описывается она с помощью зарезервированных слов Class Of Например, указатель на класс TObject описан в модуле System и называется TClass:
Type TObject=Class;
TClass=Class Of TObject;
Известны также указатели TComponentClass, TControlClass и т.п.
Примечания:
• Переменные - классовые ссылки не несут в себе информации, содержащейся в экземпляре класса, зато содержат информацию о его типе.
• Классовая ссылка используется в следующих случаях:
• когда не известен тип создаваемого объекта на этапе компиляции;
• когда необходим вызов метода класса, чей тип не известен на этапе компиляции:
• в качестве правого операнда в операциях проверки и приведения типов (Is и As).
• Указатели на классы тоже подчиняются правилам приведения объектных типов.
• Ссылки можно использовать во всех выражениях, где допустимо использование типа данных. Например, конструкторы, а также классовые процедуры и функции могут вызываться с помощью ссылки на класс.
• Указатель на класс-предок может ссылаться и на любые дочерние классы, но обратное невозможно.
Type
TMyClass=Class(TObject)
. . .
End;
TObjRef=Class Of TObject;