Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Визуальное программирование / Визуальное_программирование_лекция_18.doc
Скачиваний:
43
Добавлен:
07.06.2015
Размер:
191.49 Кб
Скачать
  1. Иерархии классов

Если на диаграмме классов показано только отношение наследования, то диаграмму называют иерархией классов.

В профессиональных средах программирования существуют мощные библиотеки классов, на базе которых строятся классы для решения конкретной задачи. Не является исключением и среда программирования Delphi.

Компоненты Delphi входят в библиотеку визуальных компонентов (Visual Component Library). Библиотека визуальных компонентов содержит большое число классов “готовых к употреблению”. Вся VCL построена по иерархическому принципу. Хотя VCL и называется библиотекой визуальных компонентов, на самом деле в нее входят также и невизуальные компоненты. Визуальные компоненты видны на форме как во время создания приложения, так и во время работы приложения. Невизуальные компоненты – видны только во время разработки приложения.

Все компоненты VCL являются классами. И все они являются потомками базового класса TObject. Данный класс является абстрактным и содержит базовые методы, которые наследуются классами-потомками. Основные методы класса TObject - это:

Create - метод, вызываемый для создания объекта;

Destroy - метод, вызываемый для удаления объекта;

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

Прямыми потомками класса TObject являются классы TPersistent, TException, TIniFile и другие классы.

Класс TPersistent добавляет к методам класса TObject метод Assign. Этот метод позволяет передавать поля и свойства одного объекта другому.

Потомками класса TPersistent являются классы TComponent, TClipboard и TStrings. Именно класс TComponent является базовым классом для всех компонентов VCL Delphi, расположенных в палитре компонентов.

TObject является общим предком всех классов в Delphi, корнем иерархии Visual Component Library. Tobject представляет собой абстрактный класс, реализующий только наиболее общие механизмы, универсально разделяемые всеми объектами VCL.

TObject автоматически используется как порождающий тип при создании нового класса Delphi. Следующие фрагменты кода имеют одно и то же значение:

type

TNewObject = class

end;

type

TNewObject = class (TObject)

end;

TObject объявляет конструктор и деструктор (специальные методы, которые создают и разрушают объекты) и реализует информацию о типе и методах обработки сообщений. Поскольку TObject является абстрактным классом, большинство его методов перекрывается в его потомках в рамках VCL. Обычно будет доступ к порожденной реализации Create, конструктору и Free, безопасно вызывающему деструктор Destroy.

TComponent является предком всех компонентов VCL-библиотеки. Все потомки данного класса могут быть расположены в палитре компонентов. Класс TComponent позволяет определять родительский элемент управления и владельца компонента.

Таблица отображает методы общецелевого назначения, реализуемые TObject. В общем случае из этих методов разработчикам приложений интересны только три: Create, Destroy и Free.

Таблица. Методы, реализуемые TObject

Использовать или установить это...

Чтобы сделать это...

ClassName

Получить имя класса объекта.

ClassParent

Получить родительский класс объекта.

ClassType

Получить действительный тип объекта.

Create

Сконструировать новый объект.

DefaultHandler

Данная виртуальная функция не имеет реализации - на уровне T0bject она ничего не делает.

Destroy

Разрушить объект

Free

Разрушить объект, сконструированный Create.

InheritsFroin

Определить, порожден ли объект от определенного класса.

InstanceSize

Определить количество памяти, отведенное объекту.

Метод ClassName

Затрагиваемые объекты Все объекты.

Назначение Метод ClassName возвращает имя объекта или класса.

Объявление class function ClassName: string;

Пример синтаксиса // Создать (Create) форму с простой командной кнопкой.

// Когда кнопка нажимается, заголовок Form1 изменяется

// на "TButton"

procedure TForm1.Button1Click(Sender: TObject);

begin

Form1.Caption := Button1.ClassName;

end;

Описание ClassName возвращает строку, содержащую название реального типа текущего объекта. В приведенном примере Button1 имеет тип TButton и таково название, возвращаемое ClassName. Если вы порождаете новый тип от другого типа и затем используете ClassName, функция вернет название нового типа. Необходимость в знании названия класса объекта возникает редко. Для определения типа объекта (в отличие от названия его типа) используйте оператор is, который обсуждался в главе 2, "Основы VCL".

Метод ClassParent

Затрагиваемые объекты Все объекты.

Назначение Метод ClassParent возвращает родительский класс объекта или класса.

Объявление class function ClassParent: TClass;

Пример синтаксиса procedure TForm1.Button1Click(Sender: TObject);

var

// Создать переменную типа TCIass

MyParent: TClass;

begin

// Сначала присвоить тип класса Buttoni

// переменной MyParent

MyParent := Button1.ClassType;

// Затем использовать ClassParent для определения

// родительского класса MyParent

MyParent := MyParent.ClassParent;

// Наконец, вывести строку с ClassName

Form1.Caption := MyParent.ClassName;

end;

Описание ClassParent возвращает непосредственный предок текущего класса. Возвращаемый тип ClassParent является TCIass, который представляет собой прямого потомка TObject и в основном является тем же, что и TObject, поскольку не добавляет никакой функциональности к базовому классу. Обычно ClassParent используется для определения того, можно ли текущий объект законно присвоить другому объекту. TObject.ClassParent возвратит Nil ввиду того, что поскольку TObject не имеет родительского класса. Программисту приложений или компонентов редко приходится вызывать ClassParent, хотя внутренне ClassParent и используется операторами is и as, и методом InheritsFrom (описанным ниже).

Метод ClassType

Затрагиваемые объекты Все объекты.

Назначение Метод ClassType возвращает тип класса объекта.

Объявление function ClassType: TCIass;

Пример синтаксиса // Когда нажимается кнопка, заголовок

// TForm1 изменяется на "TButton"

procedure TForm1.Button1.Click(Sender: TObject);

begin

Form1.Caption := Button1.ClassType.ClassName;

end;

Описание ClassType возвращает действительный тип объекта, а не просто его имя, как это делает ClassName. В отличие от ClassInfo, ClassName и ClassParent, ClassType оперирует объектами (экземплярами класса), а не классами (типами объектов). ClassType возвращает информацию, подобную возвращаемой оператором is. Фактически операторы is и as сами вызывают ClassType.

Метод Create

Затрагиваемые объекты Все объекты.

Назначение Метод Create является конструктором в Object Pascal.

Объявление constructor Create;

Пример синтаксиса // При создании формы динамически соадаег новый

// объект и печатает в заголовке

// формы тип класса нового объекта, TObject.

procedure TFonnI.FonnCreate (Sender: TObject);

var

MyObject: TObject;

begin

MyObject := TObject.Create;

Form1.Caption := MyObject.ClassType.ClassName;

end;

Описание Create применяется для конструирования объекта посредством распределения для него памяти и инициализации всех данных объекта Create распределяет и инициализирует память, необходимую конструируемому объекту.

Каждый класс в VCL перекрывает или повторно реализует Create тем или иным образом. Объекты, экземпляры которых получены Create, должны разрушаться посредством Free.

Метод Destroy

Затрагиваемые объекты Все объекты.

Назначение Метод Destroy используется для разрушения объекта,

Объявление destructor Destroy;

Описание Destroy является деструктором Delphi. Он используется для разрушения объекта и освобождения памяти, которая была распределена объекту. Destroy вызывается методом Free, представляющим собой функцию, которую следует вызывать для разрушения объектов, сконструированных Create.

Метод Free

Затрагиваемые объекты Все объекты.

Назначение Метод Free используется для разрушения объекта.

Объявление procedure Free;

Пример синтаксиса // разрушить объект Anobject

Anobject. Free;

Описание Если вы создали объект, то для разрушения объекта и освобождения распределенной памяти следует использовать Free. Free гарантирует успешную работу даже тогда, когда объект является NIL, поэтому Free следует всегда применять вместо Destroy. На самом деле Free вызывает Destroy, если разрушаемый объект отличный от NIL.

Метод InheritsFrom

Затрагиваемые объекты Все объекты.

Назначение Метод InheritsFrom определяет, порожден ли объект от объекта другого типа.

Объявление class function lnheritsFrom(ACIass: TCIass): Boolean;

Параметры

AClass Параметр может быть любым классовым типом.

Пример синтаксиса // Поскольку TButton является потомком TWinControl,

// данный обработчик события изменит заголовок

// формы

procedure TFonnl.ButtonlClick(Sender: TObject);

begin

if (Sender. lnheritsFrom(TWinControl)) then

Form1.Caption:='TButton descends from TWinControl';

end;

Описание InheritsFrom возвращает True, если тип объекта, указанный параметром AClass,

является предком объекта. Если объект не происходит от типа, указанного AClass,

метод возвращает False.

Операторы is и as внутренне используют InheritsFrom.

Метод InstanceSize

Затрагиваемые объекты Все объекты.

Назначение Метод InstanceSize возвращает количество памяти, распределенное каждому экземпляру объекта заданного типа.

Объявление class function InstanceSize: Word;

Описание InstanceSize возвращает количество байт, требуемое для размещения каждого экземпляра объекта, который вызывает метод InstanceSize. Это внутренняя функция и обычно разработчиками не применяется. Вместо нее используйте функцию sizeof;

ButtonSize := sizeof (Buttoni);

InstanceSize не является виртуальной, поэтому ее нельзя перекрыть.

11