Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование.docx
Скачиваний:
20
Добавлен:
31.08.2019
Размер:
112.85 Кб
Скачать
  1. Интерфейсы и реализация.

Интерфейс (от лат. inter — между и лат. face — поверхность) — это семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом. Интерфейс определяет границу взаимодействия между классами или компонентами, специфицируя определенную абстракцию, которую осуществляет реализующая сторона. В отличие от многих других видов интерфейсов, интерфейс в ООП является строго формализованным элементом объектно-ориентированного языка и, в качестве семантической конструкции, широко используется кодом программы.

Реализация методов интерфейса. Класс, который реализует интерфейс, нужен, чтобы обеспечить реализацией каждый метод, объявленный в интерфейсе. Реализация может быть обеспечена или явным объявлением или в соответствии с наследованием от предка класса.

Вариантов реализаций здесь несколько:

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

- Явное разрешение неоднозначности. Вариантом этого решения является явное переименование для совпадающих по именам наследуемых или реализуемых методов

- Общая реализация одноимённых методов. Хорошо подходит для случаев, когда одноимённые методы разных интерфейсов идентичны по предполагаемой функциональности.

В Delphi интерфейсы были введены для поддержки COM технологии фирмы Microsoft.

Интерфейсы в Delphi напоминают классы. Как все классы являются наследниками класса TObject, так и все интерфейсы происходят от интерфейса IUnknown, соответствующего стандартному одноимённому COM-интерфейсу.

Пример объявления интерфейса:

IMyInterface = interface

procedure DoSomething;

end;

Для того, чтобы объявить о реализации интерфейсов, в описании класса необходимо указать их имена в скобках после ключевого слова class, после имени класса-предка. Так как интерфейс — это контракт, который нужно выполнить, программа не компилируется пока в реализующем классе не будет реализована procedure DoSomething;

Вышеупомянутая ориентированность интерфейсов Delphi на технологию COM привела к некоторым неудобствам. Дело в том, что интерфейс IUnknown (от которого наследуются все остальные интерфейсы) уже содержит три метода: QueryInterface,_AddRef, _Release, следовательно, любой класс, реализующий любой интерфейс, обязан реализовать эти методы, даже если интерфейс и класс не имеют никакого отношения к COM.

Пример класса, реализующего интерфейс

TMyClass = class(TMyParentClass, IMyInterface)

procedure DoSomething;

function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;

function _AddRef: Integer; stdcall;

function _Release: Integer; stdcall;

end;

Программист должен правильно реализовать методы QueryInterface,_AddRef, _Release. Чтобы избавиться от необходимости писать стандартные методы, предусмотрен библиотечный класс TInterfacedObject — он реализует три вышеупомянутых метода и любой класс, наследуемый от него и его потомков, получает эту реализацию:

Пример класса — наследника TInterfacedObject

TMyClass = class(TInterfacedObject, IMyInterface)

procedure DoSomething;

end;

Недостатком такого решения является ограничение на структуру дерева классов: невозможно унаследовать класс, реализующий интерфейс, от какого-либо другого своего класса.