Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Объявление класса и объекта




Оператор объявления класса имеет вид:

Type <имя класса> = Class [(<имя родительского класса>)]

[ Public <поля, методы, свойства и события доступные всем вне класса>]

[ Published <аналогичен Public и изменяемый в инспекторе объекта>]

[ Private <поля, методы, свойства и события доступные только в классе>]

[ Protected <аналогичен Private и дополнительно доступный потомкам>]

[ Automated <аналогичен Public для потомка класса TAutoObject>]

End; //окончание объявления класса

По умолчанию имя родительского класса TObject (наиболее общий предопределенный класс). Класс наследует поля, свойства, методы и события своих предков и может их изменять или вводить новые.

Объявления полей и методов в классе не отличаются от объявлений обычных переменных, процедур или функций.

Объект объявляется в разделе переменных оператором вида:

<имя объекта>: <имя класса>;

Доступ к полям, свойствам и методам объекта реализуется указа­нием имени объекта и через точку имени поля, свойства или метода.

Пример задания значения свойству Caption объекта Button1:

Button1.Caption:=’Выход’; //надпись командной кнопки «Выход»

Динамическое создание и удаление объекта

Существуют методы классов, которые уточняются при вызове не именем объекта, а именем класса. Подобные методы не могут обращаться к полям объекта, так как они существуют только в объектах. При объяв­лении и в заголовке таких методов в начале указывается слово Class.

Пример:

Type TUser=Class; I:Integer; Public Class Function Sozd: Integer; End;...

Class Function TUser.Sozd: Integer; Begin... End;... N:=TUser.Sozd;

Для динамического создания объекта используется метод Create в виде: <переменная типа класса> := <имя класса>. Create;

Для удаления объекта используется метод Free в виде:

<переменная типа класса>. Free;

Доступ к полям, свойствам и методам динамически созданного объекта реализуется указанием имени переменной типа класса и через точку имени поля, свойства или метода.

Пример:

Type T1=Class(TObject); Procedure Move; End; //объявление класса T1

T2=Class(TObject); Procedure Move; End; //объявление класса T2

Var O1: T1; O2: T2; //объявление переменных типа классов T1, T2

Begin O1:=T1.Create; O2:=T2.Create; //создание объектом класса T1, T2

O1.Move;... O2.Move;//вызов метода Move класса T1 и T2, соответственно

O1.Free; O2.Free; //удаление объектов O1, O2 классов T1, T2

Динамическое конструирование объектов

Можно объявлять новый тип, являющийся ссылкой на класс:

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

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...