Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Динамическое создание и удаление объектаСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Существуют методы классов, которые уточняются при вызове не именем объекта, а именем класса. Подобные методы не могут обращаться к полям объекта, так как они существуют только в объектах. При объявлении и в заголовке таких методов в начале указывается слово 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 Конструкторы и деструкторы Конструкторы ‑ специальные методы, создающие объекты. Они объявляются подобно процедурам, но в начале указывается слово Constructor. Обычно именем конструктора является слово Create. В качестве параметра (Owner) может использоваться владелец объекта. В реализации конструктора вначале обычно идет вызов наследуемого конструктора с помощью слова Inherited. В результате инициируются все наследуемые поля, а затем инициируются новые поля данного класса. В базовом классе TObject имеется готовый конструктор Create, который и обычно используется для создания объектов. Деструкторы ‑ методы, уничтожающие объекты. Они объявляются подобно процедурам, но в начале указывается слово Destructor. Обычно именем конструктора является слово Destroy. Реализация деструктора обычно завершается вызовом наследуемого деструктора с помощью слова Inherited. В базовом классе TObject имеется готовый деструктор Desrtoy. Пример: Destructor Destroy; Override; События Событие ‑ это специальное свойство ‑ указатель функции типа TNotifyEvent с одним параметром (обычно Self - данный объект) типа TObject. Подобный тип используется для всех событий с одним параметром Sender:TObject (например, OnClick -щелчок мышки). Пример ввода события в класс: объявление поля и метода работы: Private FMyEvent:TNotifyEvent; //объявление поля для свойства Published Property MyEvent:TNotifyEvent Read FMyEvent Write FMyEvent; Для вызова обработчика нужно указать в нашем примере: If Assigned(FmyEvent) Then //проверка наличия обработчика пользователя OnMyEvent(Self) //вызов обработчика MyEvent Если в обработчик передаются другие параметры, кроме Self, то объявляется собственный тип: Type TMyEvent=Procedure(Sender:TObject,Var DEvent: Boolean) Of Object; T=Class(TObject); Private FMyEvent:TmyEvent; Published Property MyEvent:TMyEvent Read FMyEvent Write FMyEvent; End; Вопросы для самопроверки и контроля Вопросы для самопроверки 1. Каковы свойства объектно‑ориентированного программирования? 2. Назначение метода‑конструктора объекта. Контрольные вопросы 1. Каково назначение метода‑деструктора объекта? 2. Допускает ли Delphi традиционное и объектно‑ориентированное программирование? 3. Заменяет ли одноименный статический метод в потомке родительский?
|
||||
Последнее изменение этой страницы: 2017-02-08; просмотров: 481; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.28.160 (0.007 с.) |