Интерфейс (объектно-ориентированное программирование)

Предлагается объединить эту статью с COM-интерфейс. (Обсудить)

Интерфе́йс (от лат. Inter — между и лат. faceповерхность) — это семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом.

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

С одной стороны, интерфейс — это контракт, который обязуется выполнить класс, имплементирующий его. Один класс может имплементировать несколько интерфейсов одновременно.
С другой стороны, интерфейс — это тип данных, потому что его описание достаточно четко определяет свойства объектов, чтобы наравне с классом типизировать переменные.

Содержание

Интерфейсы в Delphi

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

Интерфейсы в Delphi напоминают классы. Как все классы являются наследниками класса TObject, так все интерфейсы происходят от интерфейса IUnknown. Для работы с интерфейсами программисту необходимо приложить некоторые усилия, а именно создать и правильно реализовать методы: QueryInterface,_AddRef, _Release. Эта рутинная работа уже проделана в классе TInterfacedObject.

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

 IMyInterface = interface
   procedure DoSomething;
 end;

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

 TMyClass = class(TInterfacedObject, IMyInterface)
   procedure DoSomething;
 end;

Так как интерфейс - это контракт, который нужно выполнить, программа не компилируется пока в TMyClass не будет реализована procedure DoSomething;

Интерфейсы в C++

Роль интерфайсов в C++ выполняют абстрактные классы.

Интерфейсы в Java

От интерфейсов в Java нельзя порождать объекты, другие классы могут реализовывать их.

Объявление интерфейсов

Объявление интерфейсов очень похоже на упрощенное объявление классов.

Оно начинается с заголовка. Сначала указываются модификаторы. Интерфейс может быть объявлен как public и тогда он будет доступен для общего использования, либо модификатор доступа может не указываться, в этом случае интерфейс доступен только для типов своего пакета. Модификатор abstract для интерфейса не требуется, поскольку все интерфейсы являются абстрактными. Его можно указать, но делать этого не рекомендуется, чтобы не загромождать код.

Далее записывается ключевое слово interface и имя интерфейса.

После этого может следовать ключевое слово extends и список интерфейсов, от которых будет наследоваться объявляемый интерфейс. Родительских типов может быть много, главное, чтобы не было повторений и чтобы отношение наследования не образовывало циклической зависимости.

Наследование интерфейсов действительно очень гибкое. Так, если есть два интерфейса, A и B, причем B наследуется от A, то новый интерфейс C может наследоваться от них обоих. Впрочем, понятно, что указание наследования от A является избыточным, все элементы этого интерфейса и так будут получены по наследству через интерфейс B.

Затем в фигурных скобках записывается тело интерфейса.

public interface Drawble extends Colorable, 
  Resizable {
}

Тело интерфейса состоит из объявления элементов, то есть полей-констант и абстрактных методов. Все поля интерфейса должны быть public final static, так что эти модификаторы указывать необязательно и даже нежелательно, чтобы не загромождать код. Поскольку поля объявляются финальными, необходимо их сразу инициализировать.

public interface Directions {
  int RIGHT=1;
  int LEFT=2;
  int UP=3;
  int DOWN=4;
}

Все методы интерфейса являются public abstract и эти модификаторы также необязательны.

public interface Moveable {
  void moveRight();
  void moveLeft();
  void moveUp();
  void moveDown();
}

Как мы видим, описание интерфейса гораздо проще, чем объявление класса.

Реализация интерфейса

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

Если из разных источников наследуются методы с одинаковой сигнатурой, то достаточно один раз описать реализацию и она будет применяться для всех этих методов. Однако если у них различное возвращаемое значение, то возникает конфликт:

interface A {
 int getValue();
}
interface B {
 double getValue();
}

Интерфейсы в UML

Интерфейсы в UML используются для визуализации, специфицирования, конструирования и документирования стыковочных узлов между составными частями системы. Типы и роли обеспечивают механизм моделирования статического и динамического соответствия абстракции интерфейсу в конкретном контексте.

В UML интерфейсы изображаются как классы со стереотипом «interface». Либо в виде кружочков, в этом случае происходит отображения содержашихся в интерфейсе операций.

См. также


 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home