Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 548; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.20 (0.012 с.) |