ООП/Интерфейс

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Интерфейс (иногда так же контракт, interface) в объектно-ориентированной парадигме программирования — частный случай абстрактного класса.

Общее понятие интерфейса и сравнение с абстрактным классом

В отличие от абстрактного класса, который может содержать в себе почти всё то же, что и обычный класса, интерфейс может содержать в себе только константы и абстрактные методы. Все элементы интерфейса являются публичными (public) так как это заложено самой природой интерфейса, поэтому модификатор доступа к элементам интерфейса можно и не писать, там по умолчанию всё public. В Java в интерфейсах можно декларировать и обычные переменные, что может запутать так как компилятор хоть и разрешает это делать, но всё равно все переменные интерфейса превращаются в константы.

Предназначение интерфейсов

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

Интерфейсы выполняют всё ту же роль абстрактных элементов, то есть заставляют реализующие классы реализовывать описанные абстрактные методы. По этому интерфейсы реализовывают (не расширяют/наследуют), а именно реализовывают в классах. Разумеется, создать объект интерфейса нельзя. Использовать напрямую абстрактные классы и интерфейсы нельзя, их надо расширять/наследовать и реализовывать.

Основные моменты касательно интерфейсов

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

В отличие от классов интерфейсы не расширяют или наследуют а реализуют (ключевое слово implements). Так же большинстве языков программирования разрешено множественное наследование интерфейсов в отличие от классов, которые можно наследовать только по одному.

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

Языки использующие интерфейсы

Интерфейсы присущи современным ленивым объектно-ориентированным языкам программирования таким как Java и C#. В том же хардкорном C++ интерфейсов нет так как там для этого есть абстрактные классы и разрешённое множественное наследование классов.

Правила хорошего тона написания программного кода и интерфейсы

По правилам хорошего тона написания программного кода первая буква названия интерфейса так же как и в названиях классов пишется в верхнем регистре, часто так же добавляют префикс — буква «I», что бы явно можно было отличить интерфейс от класса по названию, хотя часто и к названиям классов добавляют префикс «C», но встречается это реже, чем подобная же практика у интерфейсов.

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

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

Интерфейс и абстрактный класс

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

Примеры интерфейсов

PHP

Пример описания интерфейса на PHP:

interface IHand {
	function useKeyboard();
	function touchNose();
}
interface IFoot {
	function runFast();
	function playFootball();
}
class Human implements Hand, Foot {
	function useKeyboard() {echo 'Use keyboard!'};
	function touchNose() {echo 'Touch nose!'};
	function runFast() {echo 'Run fast!'};
	function playFootball() {echo 'Play football!'};
}