Интерфейсы
В этой главе мы рассмотрим,
что такое интерфейс и где он применяется. Кроме того, вы узнаете, что такое
графический интерфейс пользователя, и познакомитесь с методами создания SDI-
и MDI- приложений.
Понятие интерфейса
Ключевое слово Kylix interface
позволяет вам создавать и использовать интерфейсы в ваших приложениях. Интерфейсы
расширяют модель наследования в CLX, позволяя одному классу принадлежать нескольким
интерфейсам, а также нескольким классам — наследникам различных базовых классов
— использовать один интерфейс. Интерфейсы полезны в тех случаях, когда наборы
операций, таких как потоки, используются большим количеством объектов.
Таким образом, интерфейсы
— это средства для обеспечения взаимодействия между разными объектами.
Интерфейсы похожи на классы,
которые содержат в себе только абстрактные методы и четкие определения их функциональности.
Определение метода интерфейса включает в себя параметры и типы параметров, возвращаемый
тип, а также ожидаемое поведение. Методы интерфейса семантически или логически
связаны с отражением цели интерфейса, Существует соглашение об интерфейсах,
гласящее, что каждый интерфейс должен быть назван в соответствии с задачей,
которую он предназначен выполнять. Например, интерфейс IMalloc
— предназначен для распределения, освобождения и управления памятью. Аналогично,
интерфейс IPersist
может использоваться как базовый интерфейс для
потомков, каждый из которых определяет специфичные прототипы методов для загрузки
и сохранения состояния объектов в память, поток или в файл. В листинге 10.1
приведен простой пример объявления интерфейса.
Листинг 10.1.Объявление
интерфейса
type
IEdit = interface
procedure Copy; stdcall; procedure Cut; stdcall; procedure Paste; stdcall; function Undo: Boolean; stdcall; end;
Примечание
Тем читателям, которые имеют слабое представление о создании компонентов и новых классов, советуем прочитать пятую часть книги, посвященную созданию собственных компонентов и модификации уже существующих.
Нельзя создать экземпляр
интерфейса при помощи интерфейса. Для получения экземпляра интерфейса вам нужно
объявить его в классе, содержащем данный интерфейс. Таким образом, нужно определить
класс, который содержит необходимый интерфейс в списке своих родителей (листинг
10.2).
Листинг 10.2.Объявление
класса, содержащего интерфейс
TEditor = class(TInterfacedObject, IEdit)
procedure Copy; stdcall;
function Undo: Boolean; stdcall; end;
procedure Cut; stdcall; procedure Paste; stdcall;
Как уже было отмечено выше,
использование интерфейсов позволяет нескольким классам общаться с помощью общего
интерфейса. При этом не обязательно наличие одного базового класса-предка. Следует
помнить, что интерфейс — это тип с управляемым временем жизни, т. е. он автоматически
при инициализации принимает значение nil
, обладает счетчиком ссылок
и автоматически уничтожается при выходе за пределы своей области видимости.