Динамическое конструирование объектов
Можно объявлять новый тип, являющийся ссылкой на класс:
Type <имя ‑ класса>=Class Of <тип класса>;
Пример: Type TU=Class Of TObject; Var U:TU;
Переменная U может хранить в себе объект любого класса ‑ потомка TObject. Если имеется подпрограмма обработки объекта, тип которого будет известен только при вызове этой подпрограммы, то в качестве параметра нужно указать тип класса данного объекта. В нашем примере:
Procedure UserO(O:TU);//заголовок процедуры UserO с параметром O:TU...
UserO(TButton);//вызов процедуры обработки объекта - командной кнопки
UserO(TEdit); //вызов процедуры обработки объекта - текстового поля
Для определения типа объекта используется оператор вида:
<объект> Is <имя типа объекта>. Он возвращает истину, если объект соответствует указанному типу.
Пример: If O Is TButton Then ...//проверка типа объекта
Если объект описан как ссылка на класс, то для доступа к полям и методам определенного типа класса применяется операция приведения к конкретному типу (<объект> As <класс>).
Пример: (U As TEdit).Text:=’Иванов’; //поле Text класса TEdit
Свойства
Свойство объявляется в виде:
Property<имя> :<тип> [Read <имя поля или метода чтения>]
[Write <имя поля или метода записи> <директивы запоминания>];
Обычно имена методов чтения или записи начинаются со слов Get или Set соответственно, и далее ‑ имя свойства. Обычно используется директива запоминания вида: Default<значение по умолчанию>.
Имя поля обычно начинается с буквы F, а затем указывается имя свойства, значение которого хранится в этом поле.
Пример объявления класса в модуле Unit1:
Unit Unit1;... //заголовок модуля
Type //раздел объявления типов
MyClass=Class(TObject) //объявление класса MyClass
Private FP: Integer; //объявление закрытого поля FP свойства P
Protected Procedure SetP(Value: Integer); //процедура записи свойства P
Published Property P:Integer //объявляется публикуемое свойство P
Read FP //свойство P непосредственно читается из поля FP
Write SetP default 0; //свойство P изменяется процедурой SetP
End; //окончание объявления класса MyClass ...
Implementation //исполняемая часть модуля
Procedure MyClass.SetP(Value:Integer); //процедура изменения свойства FP
Begin FP:=Value; End; //значение параметра присваивается полю свойства...
End. //окончание модуля
Методы
Для вызова из потомка одноименного метода ближайшего родительского класса указывается оператор Inherited. Для вызова неодноименного родительского метода указывается Inherited <имяметода>.
Методы могут быть статическими, виртуальными, динамическими и абстрактными. Типы методов также наследуются.
Одноименный статический метод в потомке заменяет родительский. При обращении к родительскому классу будет использоваться его метод, а не метод потомка.
Виртуальные и динамические методы не связаны с другими одноименными методами в классах‑потомках. При вызове метода будет использован метод класса, указанного при вызове. Разница между виртуальными и динамическими методами заключается в максимизации скорости и экономии памяти соответственно.
Пример использования базового графического класса TSHape:
Var Shapes:Array[1..5] Of TShape;//массив новых графических классов ...
For I:=1 To 5 Do Shapes[I].Draw; //вызов метода Draw класса Shapes[I]
При объявлении таких методов после точки с запятой добавляются слова Virtualили Dinamicсоответственно.
Пример: Type TShape=Class Procedure Draw; Virtual; End;
Такие методы из родительского класса могут быть перекрыты в классах‑потомках одноименными методами, если после заголовка метода указать оператор Override.
Пример:
Type TShape=Class Procedure Draw; Virtual; End; //виртуальный метод Draw
TRect=Class(TShape) Procedure Draw; Override; End; //перекрытие Draw
TEllipse=Class(TShape) Procedure Draw; Override; End;//перекрытие Draw
Абстрактныйметод ‑ это виртуальный или динамический метод, реализация которого не определена в классе, в котором он объявлен. При объявлении таких методов после слова Virtual или Dinamic соответственно добавляется слово Abstract.
Пример: Type TShape=Class Procedure Draw; Virtual; Abstract; End;
Любой метод может быть перегружен с помощью слова Overload (п. 6.2.7), а для виртуальных методов добавляется слово Reintroduce.
Пример:
Type T1=Class(TObject) Procedure Out(I:Integer); Overload; Virtual; End;
T2=Class(T1) Procedure Out(I:String); Reintroduce; Overload; End; ...
X:=T2.Create; //создание объекта класса T2
X.Out(‘Иванов’); //вызывается метод Out класса T2
X.Out(1970); //вызывается метод Out класса T1
Дата добавления: 2016-03-22; просмотров: 666;