![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Динамическое конструирование объектов
Можно объявлять новый тип, являющийся ссылкой на класс: 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
|