В чем суть интерфейсов в программировании? Корректировка кода в будущем. Для чего используются интерфейсы PHP

Интерфейс (иногда так же контракт , 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!"}; }

Материал из Википедии - свободной энциклопедии

/** * interface.Openable.h * */ #ifndef INTERFACE_OPENABLE_HPP #define INTERFACE_OPENABLE_HPP // Класс интерфейса iOpenable. Определяет возможность открытия/закрытия чего-либо. class iOpenable { public: virtual ~iOpenable(){} virtual void open()=0; virtual void close()=0; }; #endif

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

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

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

Пример объявления интерфейса (Ошибка если Colorable и Resizable классы: The type Colorable and Resizable cannot be a superinterface of Drawable; a superinterface must be an interface):

public interface Drawable extends Colorable, Resizable { }

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(); }

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

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

Для реализации интерфейса он должен быть указан при декларации класса с помощью ключевого слова implements . Пример:

interface I { void interfaceMethod(); } public class ImplementingInterface implements I { void interfaceMethod() { System.out.println("Этот метод реализован из интерфейса I"); } } public static void main(String args) { ImplementingInterface temp = new ImplementingInterface(); temp.interfaceMethod(); }

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

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

interface A { int getValue(); } interface B { double getValue(); } interface C { int getValue(); } public class Correct implements A, C // класс правильно наследует методы с одинаковой сигнатурой { int getValue() { return 5; } } class Wrong implements A, B // класс вызывает ошибку при компиляции { int getValue() { return 5; } double getValue() { return 5.5; } }

C#

В интерфейсы могут наследовать один или несколько других интерфейсов. Членами интерфейсов могут быть методы, свойства, события и индексаторы:

interface I1 { void Method1(); } interface I2 { void Method2(); } interface I: I1, I2 { void Method(); int Count { get; } event EventHandler SomeEvent; string this { get; set; } }

При реализации интерфейса класс должен реализовать как методы самого интерфейса, так и его базовых интерфейсов:

public class C: I { public void Method() { } public int Count { get { throw new NotImplementedException(); } } public event EventHandler SomeEvent; public string this { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public void Method1() { } public void Method2() { } }

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

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

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

См. также

Напишите отзыв о статье "Интерфейс (объектно-ориентированное программирование)"

Примечания

Ссылки

Отрывок, характеризующий Интерфейс (объектно-ориентированное программирование)

Княжна, с своею несообразно длинною по ногам, сухою и прямою талией, прямо и бесстрастно смотрела на князя выпуклыми серыми глазами. Она покачала головой и, вздохнув, посмотрела на образа. Жест ее можно было объяснить и как выражение печали и преданности, и как выражение усталости и надежды на скорый отдых. Князь Василий объяснил этот жест как выражение усталости.
– А мне то, – сказал он, – ты думаешь, легче? Je suis ereinte, comme un cheval de poste; [Я заморен, как почтовая лошадь;] а всё таки мне надо с тобой поговорить, Катишь, и очень серьезно.
Князь Василий замолчал, и щеки его начинали нервически подергиваться то на одну, то на другую сторону, придавая его лицу неприятное выражение, какое никогда не показывалось на лице князя Василия, когда он бывал в гостиных. Глаза его тоже были не такие, как всегда: то они смотрели нагло шутливо, то испуганно оглядывались.
Княжна, своими сухими, худыми руками придерживая на коленях собачку, внимательно смотрела в глаза князю Василию; но видно было, что она не прервет молчания вопросом, хотя бы ей пришлось молчать до утра.
– Вот видите ли, моя милая княжна и кузина, Катерина Семеновна, – продолжал князь Василий, видимо, не без внутренней борьбы приступая к продолжению своей речи, – в такие минуты, как теперь, обо всём надо подумать. Надо подумать о будущем, о вас… Я вас всех люблю, как своих детей, ты это знаешь.
Княжна так же тускло и неподвижно смотрела на него.
– Наконец, надо подумать и о моем семействе, – сердито отталкивая от себя столик и не глядя на нее, продолжал князь Василий, – ты знаешь, Катишь, что вы, три сестры Мамонтовы, да еще моя жена, мы одни прямые наследники графа. Знаю, знаю, как тебе тяжело говорить и думать о таких вещах. И мне не легче; но, друг мой, мне шестой десяток, надо быть ко всему готовым. Ты знаешь ли, что я послал за Пьером, и что граф, прямо указывая на его портрет, требовал его к себе?
Князь Василий вопросительно посмотрел на княжну, но не мог понять, соображала ли она то, что он ей сказал, или просто смотрела на него…
– Я об одном не перестаю молить Бога, mon cousin, – отвечала она, – чтоб он помиловал его и дал бы его прекрасной душе спокойно покинуть эту…
– Да, это так, – нетерпеливо продолжал князь Василий, потирая лысину и опять с злобой придвигая к себе отодвинутый столик, – но, наконец…наконец дело в том, ты сама знаешь, что прошлою зимой граф написал завещание, по которому он всё имение, помимо прямых наследников и нас, отдавал Пьеру.
– Мало ли он писал завещаний! – спокойно сказала княжна. – Но Пьеру он не мог завещать. Пьер незаконный.
– Ma chere, – сказал вдруг князь Василий, прижав к себе столик, оживившись и начав говорить скорей, – но что, ежели письмо написано государю, и граф просит усыновить Пьера? Понимаешь, по заслугам графа его просьба будет уважена…
Княжна улыбнулась, как улыбаются люди, которые думают что знают дело больше, чем те, с кем разговаривают.
– Я тебе скажу больше, – продолжал князь Василий, хватая ее за руку, – письмо было написано, хотя и не отослано, и государь знал о нем. Вопрос только в том, уничтожено ли оно, или нет. Ежели нет, то как скоро всё кончится, – князь Василий вздохнул, давая этим понять, что он разумел под словами всё кончится, – и вскроют бумаги графа, завещание с письмом будет передано государю, и просьба его, наверно, будет уважена. Пьер, как законный сын, получит всё.
– А наша часть? – спросила княжна, иронически улыбаясь так, как будто всё, но только не это, могло случиться.
– Mais, ma pauvre Catiche, c"est clair, comme le jour. [Но, моя дорогая Катишь, это ясно, как день.] Он один тогда законный наследник всего, а вы не получите ни вот этого. Ты должна знать, моя милая, были ли написаны завещание и письмо, и уничтожены ли они. И ежели почему нибудь они забыты, то ты должна знать, где они, и найти их, потому что…
– Этого только недоставало! – перебила его княжна, сардонически улыбаясь и не изменяя выражения глаз. – Я женщина; по вашему мы все глупы; но я настолько знаю, что незаконный сын не может наследовать… Un batard, [Незаконный,] – прибавила она, полагая этим переводом окончательно показать князю его неосновательность.
– Как ты не понимаешь, наконец, Катишь! Ты так умна: как ты не понимаешь, – ежели граф написал письмо государю, в котором просит его признать сына законным, стало быть, Пьер уж будет не Пьер, а граф Безухой, и тогда он по завещанию получит всё? И ежели завещание с письмом не уничтожены, то тебе, кроме утешения, что ты была добродетельна et tout ce qui s"en suit, [и всего, что отсюда вытекает,] ничего не останется. Это верно.
– Я знаю, что завещание написано; но знаю тоже, что оно недействительно, и вы меня, кажется, считаете за совершенную дуру, mon cousin, – сказала княжна с тем выражением, с которым говорят женщины, полагающие, что они сказали нечто остроумное и оскорбительное.
– Милая ты моя княжна Катерина Семеновна, – нетерпеливо заговорил князь Василий. – Я пришел к тебе не за тем, чтобы пикироваться с тобой, а за тем, чтобы как с родной, хорошею, доброю, истинною родной, поговорить о твоих же интересах. Я тебе говорю десятый раз, что ежели письмо к государю и завещание в пользу Пьера есть в бумагах графа, то ты, моя голубушка, и с сестрами, не наследница. Ежели ты мне не веришь, то поверь людям знающим: я сейчас говорил с Дмитрием Онуфриичем (это был адвокат дома), он то же сказал.
Видимо, что то вдруг изменилось в мыслях княжны; тонкие губы побледнели (глаза остались те же), и голос, в то время как она заговорила, прорывался такими раскатами, каких она, видимо, сама не ожидала.
– Это было бы хорошо, – сказала она. – Я ничего не хотела и не хочу.
Она сбросила свою собачку с колен и оправила складки платья.
– Вот благодарность, вот признательность людям, которые всем пожертвовали для него, – сказала она. – Прекрасно! Очень хорошо! Мне ничего не нужно, князь.
– Да, но ты не одна, у тебя сестры, – ответил князь Василий.
Но княжна не слушала его.
– Да, я это давно знала, но забыла, что, кроме низости, обмана, зависти, интриг, кроме неблагодарности, самой черной неблагодарности, я ничего не могла ожидать в этом доме…
– Знаешь ли ты или не знаешь, где это завещание? – спрашивал князь Василий еще с большим, чем прежде, подергиванием щек.
– Да, я была глупа, я еще верила в людей и любила их и жертвовала собой. А успевают только те, которые подлы и гадки. Я знаю, чьи это интриги.
Княжна хотела встать, но князь удержал ее за руку. Княжна имела вид человека, вдруг разочаровавшегося во всем человеческом роде; она злобно смотрела на своего собеседника.
– Еще есть время, мой друг. Ты помни, Катишь, что всё это сделалось нечаянно, в минуту гнева, болезни, и потом забыто. Наша обязанность, моя милая, исправить его ошибку, облегчить его последние минуты тем, чтобы не допустить его сделать этой несправедливости, не дать ему умереть в мыслях, что он сделал несчастными тех людей…
– Тех людей, которые всем пожертвовали для него, – подхватила княжна, порываясь опять встать, но князь не пустил ее, – чего он никогда не умел ценить. Нет, mon cousin, – прибавила она со вздохом, – я буду помнить, что на этом свете нельзя ждать награды, что на этом свете нет ни чести, ни справедливости. На этом свете надо быть хитрою и злою.
– Ну, voyons, [послушай,] успокойся; я знаю твое прекрасное сердце.
– Нет, у меня злое сердце.
– Я знаю твое сердце, – повторил князь, – ценю твою дружбу и желал бы, чтобы ты была обо мне того же мнения. Успокойся и parlons raison, [поговорим толком,] пока есть время – может, сутки, может, час; расскажи мне всё, что ты знаешь о завещании, и, главное, где оно: ты должна знать. Мы теперь же возьмем его и покажем графу. Он, верно, забыл уже про него и захочет его уничтожить. Ты понимаешь, что мое одно желание – свято исполнить его волю; я затем только и приехал сюда. Я здесь только затем, чтобы помогать ему и вам.
– Теперь я всё поняла. Я знаю, чьи это интриги. Я знаю, – говорила княжна.
– Hе в том дело, моя душа.
– Это ваша protegee, [любимица,] ваша милая княгиня Друбецкая, Анна Михайловна, которую я не желала бы иметь горничной, эту мерзкую, гадкую женщину.
– Ne perdons point de temps. [Не будем терять время.]
– Ax, не говорите! Прошлую зиму она втерлась сюда и такие гадости, такие скверности наговорила графу на всех нас, особенно Sophie, – я повторить не могу, – что граф сделался болен и две недели не хотел нас видеть. В это время, я знаю, что он написал эту гадкую, мерзкую бумагу; но я думала, что эта бумага ничего не значит.
– Nous у voila, [В этом то и дело.] отчего же ты прежде ничего не сказала мне?
– В мозаиковом портфеле, который он держит под подушкой. Теперь я знаю, – сказала княжна, не отвечая. – Да, ежели есть за мной грех, большой грех, то это ненависть к этой мерзавке, – почти прокричала княжна, совершенно изменившись. – И зачем она втирается сюда? Но я ей выскажу всё, всё. Придет время!

В то время как такие разговоры происходили в приемной и в княжниной комнатах, карета с Пьером (за которым было послано) и с Анной Михайловной (которая нашла нужным ехать с ним) въезжала во двор графа Безухого. Когда колеса кареты мягко зазвучали по соломе, настланной под окнами, Анна Михайловна, обратившись к своему спутнику с утешительными словами, убедилась в том, что он спит в углу кареты, и разбудила его. Очнувшись, Пьер за Анною Михайловной вышел из кареты и тут только подумал о том свидании с умирающим отцом, которое его ожидало. Он заметил, что они подъехали не к парадному, а к заднему подъезду. В то время как он сходил с подножки, два человека в мещанской одежде торопливо отбежали от подъезда в тень стены. Приостановившись, Пьер разглядел в тени дома с обеих сторон еще несколько таких же людей. Но ни Анна Михайловна, ни лакей, ни кучер, которые не могли не видеть этих людей, не обратили на них внимания. Стало быть, это так нужно, решил сам с собой Пьер и прошел за Анною Михайловной. Анна Михайловна поспешными шагами шла вверх по слабо освещенной узкой каменной лестнице, подзывая отстававшего за ней Пьера, который, хотя и не понимал, для чего ему надо было вообще итти к графу, и еще меньше, зачем ему надо было итти по задней лестнице, но, судя по уверенности и поспешности Анны Михайловны, решил про себя, что это было необходимо нужно. На половине лестницы чуть не сбили их с ног какие то люди с ведрами, которые, стуча сапогами, сбегали им навстречу. Люди эти прижались к стене, чтобы пропустить Пьера с Анной Михайловной, и не показали ни малейшего удивления при виде их.
– Здесь на половину княжен? – спросила Анна Михайловна одного из них…
– Здесь, – отвечал лакей смелым, громким голосом, как будто теперь всё уже было можно, – дверь налево, матушка.
– Может быть, граф не звал меня, – сказал Пьер в то время, как он вышел на площадку, – я пошел бы к себе.
Анна Михайловна остановилась, чтобы поровняться с Пьером.
– Ah, mon ami! – сказала она с тем же жестом, как утром с сыном, дотрогиваясь до его руки: – croyez, que je souffre autant, que vous, mais soyez homme. [Поверьте, я страдаю не меньше вас, но будьте мужчиной.]
– Право, я пойду? – спросил Пьер, ласково чрез очки глядя на Анну Михайловну.
– Ah, mon ami, oubliez les torts qu"on a pu avoir envers vous, pensez que c"est votre pere… peut etre a l"agonie. – Она вздохнула. – Je vous ai tout de suite aime comme mon fils. Fiez vous a moi, Pierre. Je n"oublirai pas vos interets. [Забудьте, друг мой, в чем были против вас неправы. Вспомните, что это ваш отец… Может быть, в агонии. Я тотчас полюбила вас, как сына. Доверьтесь мне, Пьер. Я не забуду ваших интересов.]
Пьер ничего не понимал; опять ему еще сильнее показалось, что всё это так должно быть, и он покорно последовал за Анною Михайловной, уже отворявшею дверь.
Дверь выходила в переднюю заднего хода. В углу сидел старик слуга княжен и вязал чулок. Пьер никогда не был на этой половине, даже не предполагал существования таких покоев. Анна Михайловна спросила у обгонявшей их, с графином на подносе, девушки (назвав ее милой и голубушкой) о здоровье княжен и повлекла Пьера дальше по каменному коридору. Из коридора первая дверь налево вела в жилые комнаты княжен. Горничная, с графином, второпях (как и всё делалось второпях в эту минуту в этом доме) не затворила двери, и Пьер с Анною Михайловной, проходя мимо, невольно заглянули в ту комнату, где, разговаривая, сидели близко друг от друга старшая княжна с князем Васильем. Увидав проходящих, князь Василий сделал нетерпеливое движение и откинулся назад; княжна вскочила и отчаянным жестом изо всей силы хлопнула дверью, затворяя ее.
Жест этот был так не похож на всегдашнее спокойствие княжны, страх, выразившийся на лице князя Василья, был так несвойствен его важности, что Пьер, остановившись, вопросительно, через очки, посмотрел на свою руководительницу.
Анна Михайловна не выразила удивления, она только слегка улыбнулась и вздохнула, как будто показывая, что всего этого она ожидала.
– Soyez homme, mon ami, c"est moi qui veillerai a vos interets, [Будьте мужчиною, друг мой, я же стану блюсти за вашими интересами.] – сказала она в ответ на его взгляд и еще скорее пошла по коридору.
Пьер не понимал, в чем дело, и еще меньше, что значило veiller a vos interets, [блюсти ваши интересы,] но он понимал, что всё это так должно быть. Коридором они вышли в полуосвещенную залу, примыкавшую к приемной графа. Это была одна из тех холодных и роскошных комнат, которые знал Пьер с парадного крыльца. Но и в этой комнате, посередине, стояла пустая ванна и была пролита вода по ковру. Навстречу им вышли на цыпочках, не обращая на них внимания, слуга и причетник с кадилом. Они вошли в знакомую Пьеру приемную с двумя итальянскими окнами, выходом в зимний сад, с большим бюстом и во весь рост портретом Екатерины. Все те же люди, почти в тех же положениях, сидели, перешептываясь, в приемной. Все, смолкнув, оглянулись на вошедшую Анну Михайловну, с ее исплаканным, бледным лицом, и на толстого, большого Пьера, который, опустив голову, покорно следовал за нею.
На лице Анны Михайловны выразилось сознание того, что решительная минута наступила; она, с приемами деловой петербургской дамы, вошла в комнату, не отпуская от себя Пьера, еще смелее, чем утром. Она чувствовала, что так как она ведет за собою того, кого желал видеть умирающий, то прием ее был обеспечен. Быстрым взглядом оглядев всех, бывших в комнате, и заметив графова духовника, она, не то что согнувшись, но сделавшись вдруг меньше ростом, мелкою иноходью подплыла к духовнику и почтительно приняла благословение одного, потом другого духовного лица.
– Слава Богу, что успели, – сказала она духовному лицу, – мы все, родные, так боялись. Вот этот молодой человек – сын графа, – прибавила она тише. – Ужасная минута!
Проговорив эти слова, она подошла к доктору.
– Cher docteur, – сказала она ему, – ce jeune homme est le fils du comte… y a t il de l"espoir? [этот молодой человек – сын графа… Есть ли надежда?]
Доктор молча, быстрым движением возвел кверху глаза и плечи. Анна Михайловна точно таким же движением возвела плечи и глаза, почти закрыв их, вздохнула и отошла от доктора к Пьеру. Она особенно почтительно и нежно грустно обратилась к Пьеру.
– Ayez confiance en Sa misericorde, [Доверьтесь Его милосердию,] – сказала она ему, указав ему диванчик, чтобы сесть подождать ее, сама неслышно направилась к двери, на которую все смотрели, и вслед за чуть слышным звуком этой двери скрылась за нею.
Пьер, решившись во всем повиноваться своей руководительнице, направился к диванчику, который она ему указала. Как только Анна Михайловна скрылась, он заметил, что взгляды всех, бывших в комнате, больше чем с любопытством и с участием устремились на него. Он заметил, что все перешептывались, указывая на него глазами, как будто со страхом и даже с подобострастием. Ему оказывали уважение, какого прежде никогда не оказывали: неизвестная ему дама, которая говорила с духовными лицами, встала с своего места и предложила ему сесть, адъютант поднял уроненную Пьером перчатку и подал ему; доктора почтительно замолкли, когда он проходил мимо их, и посторонились, чтобы дать ему место. Пьер хотел сначала сесть на другое место, чтобы не стеснять даму, хотел сам поднять перчатку и обойти докторов, которые вовсе и не стояли на дороге; но он вдруг почувствовал, что это было бы неприлично, он почувствовал, что он в нынешнюю ночь есть лицо, которое обязано совершить какой то страшный и ожидаемый всеми обряд, и что поэтому он должен был принимать от всех услуги. Он принял молча перчатку от адъютанта, сел на место дамы, положив свои большие руки на симметрично выставленные колени, в наивной позе египетской статуи, и решил про себя, что всё это так именно должно быть и что ему в нынешний вечер, для того чтобы не потеряться и не наделать глупостей, не следует действовать по своим соображениям, а надобно предоставить себя вполне на волю тех, которые руководили им.
Не прошло и двух минут, как князь Василий, в своем кафтане с тремя звездами, величественно, высоко неся голову, вошел в комнату. Он казался похудевшим с утра; глаза его были больше обыкновенного, когда он оглянул комнату и увидал Пьера. Он подошел к нему, взял руку (чего он прежде никогда не делал) и потянул ее книзу, как будто он хотел испытать, крепко ли она держится.
– Courage, courage, mon ami. Il a demande a vous voir. C"est bien… [Не унывать, не унывать, мой друг. Он пожелал вас видеть. Это хорошо…] – и он хотел итти.
Но Пьер почел нужным спросить:
– Как здоровье…
Он замялся, не зная, прилично ли назвать умирающего графом; назвать же отцом ему было совестно.
– Il a eu encore un coup, il y a une demi heure. Еще был удар. Courage, mon аmi… [Полчаса назад у него был еще удар. Не унывать, мой друг…]
Пьер был в таком состоянии неясности мысли, что при слове «удар» ему представился удар какого нибудь тела. Он, недоумевая, посмотрел на князя Василия и уже потом сообразил, что ударом называется болезнь. Князь Василий на ходу сказал несколько слов Лоррену и прошел в дверь на цыпочках. Он не умел ходить на цыпочках и неловко подпрыгивал всем телом. Вслед за ним прошла старшая княжна, потом прошли духовные лица и причетники, люди (прислуга) тоже прошли в дверь. За этою дверью послышалось передвиженье, и наконец, всё с тем же бледным, но твердым в исполнении долга лицом, выбежала Анна Михайловна и, дотронувшись до руки Пьера, сказала:
– La bonte divine est inepuisable. C"est la ceremonie de l"extreme onction qui va commencer. Venez. [Милосердие Божие неисчерпаемо. Соборование сейчас начнется. Пойдемте.]
Пьер прошел в дверь, ступая по мягкому ковру, и заметил, что и адъютант, и незнакомая дама, и еще кто то из прислуги – все прошли за ним, как будто теперь уж не надо было спрашивать разрешения входить в эту комнату.

Пьер хорошо знал эту большую, разделенную колоннами и аркой комнату, всю обитую персидскими коврами. Часть комнаты за колоннами, где с одной стороны стояла высокая красного дерева кровать, под шелковыми занавесами, а с другой – огромный киот с образами, была красно и ярко освещена, как бывают освещены церкви во время вечерней службы. Под освещенными ризами киота стояло длинное вольтеровское кресло, и на кресле, обложенном вверху снежно белыми, не смятыми, видимо, только – что перемененными подушками, укрытая до пояса ярко зеленым одеялом, лежала знакомая Пьеру величественная фигура его отца, графа Безухого, с тою же седою гривой волос, напоминавших льва, над широким лбом и с теми же характерно благородными крупными морщинами на красивом красно желтом лице. Он лежал прямо под образами; обе толстые, большие руки его были выпростаны из под одеяла и лежали на нем. В правую руку, лежавшую ладонью книзу, между большим и указательным пальцами вставлена была восковая свеча, которую, нагибаясь из за кресла, придерживал в ней старый слуга. Над креслом стояли духовные лица в своих величественных блестящих одеждах, с выпростанными на них длинными волосами, с зажженными свечами в руках, и медленно торжественно служили. Немного позади их стояли две младшие княжны, с платком в руках и у глаз, и впереди их старшая, Катишь, с злобным и решительным видом, ни на мгновение не спуская глаз с икон, как будто говорила всем, что не отвечает за себя, если оглянется. Анна Михайловна, с кроткою печалью и всепрощением на лице, и неизвестная дама стояли у двери. Князь Василий стоял с другой стороны двери, близко к креслу, за резным бархатным стулом, который он поворотил к себе спинкой, и, облокотив на нее левую руку со свечой, крестился правою, каждый раз поднимая глаза кверху, когда приставлял персты ко лбу. Лицо его выражало спокойную набожность и преданность воле Божией. «Ежели вы не понимаете этих чувств, то тем хуже для вас», казалось, говорило его лицо.
Сзади его стоял адъютант, доктора и мужская прислуга; как бы в церкви, мужчины и женщины разделились. Всё молчало, крестилось, только слышны были церковное чтение, сдержанное, густое басовое пение и в минуты молчания перестановка ног и вздохи. Анна Михайловна, с тем значительным видом, который показывал, что она знает, что делает, перешла через всю комнату к Пьеру и подала ему свечу. Он зажег ее и, развлеченный наблюдениями над окружающими, стал креститься тою же рукой, в которой была свеча.

В процессе поиска новой работы столкнулся с тем, что все работодатели хотят, чтобы было отличное знание ООП в ПХП. Чем я хуже других, подумал я, и решил перечитать главу про объектно-ориентированное программирование. И вот на очередном собеседовании мне задают вопрос — чем абстрактный класс отличается от интерфейса.
Единственное отличие, которое я знал было в том, что один класс может реализовать несколько различных интерфейсов. Но обо всем по порядку.

Абстрактные классы
Абстрактные классы используются в PHP для определения абстрактных объектов. Чтобы понять, что определяет абстрактный объект, давайте рассмотрим такое понятие, как “пища”. Все мы знаем, что такое “пища”, но не всегда смотрим на то, из чего конкретно она приготовлена. Вы видели самые разнообразные виды пищи (бифштексы, цыпленок и тому подобное), однако само по себе понятие пищи является абстрактным - оно существует только как обобщение более конкретных вещей. Подобная идея справедлива также и для абстрактных классов.

В ООП абстрактные классы предназначены для того, чтобы создать суперкласс, который будет определять абстрактные характеристики его классов-наследников. На самом деле абстрактные классы могут содержать в себе какой-либо код, а могут быть вообще без кода; кроме этого, на их основе нельзя создать экземпляр напрямую. Рассмотрим пример:

value = NULL; } } class Integer extends Number { private $value; public function value() { return (int)$this->value; } } $num = new Integer; /* Все в порядке */ $num2 = new Number; /* Возникнет ошибка */ ?>

abstract class Number {

private $value ;

abstract public function value () ;

public function reset () {

$this -> value = NULL ;

class Integer extends Number {

private $value ;

public function value () {

return (int ) $this -> value ;

$num = new Integer ; /* Все в порядке */

$num2 = new Number ; /* Возникнет ошибка */

Тут мы создали абстрактный класс Number, который является расширением класса Integer. Поскольку класс Number объявлен как abstract, на его основе нельзя создавать экземпляры. Если посмотреть на класс Number, то можно увидеть, что в нем определены две функции: value() и reset(). Абстрактный класс может не содержать код для методов, хотя при необходимости его можно добавить. Что же касается класса Number, то поскольку функция value() является специфической для конкретного типа числа, она реализуется в классе-наследнике. Чтобы разработчик мог реализовать такое поведение в своем коде, используется ключевое слово abstract, указывающее на то, что это просто заполнитель в классе Number. Однако это не относится к методу reset(), который остается неизменным для любого конкретного типа числа.

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

interface printable {

public function printme () ;

Чтобы интерфейс приносил определенную пользу, он должен быть реализован с помощью одного или нескольких классов. Далее будет определен интерфейс printable, который заявляет, что любой класс, реализующий этот интерфейс, должен реализовать метод printme(). Чтобы создать класс, реализующий подобный интерфейс, в определении класса используется ключевое слово implements, за которым следует список реализованных интерфейсов:

value; } public function printme() { echo (int)$this->value; } } ?>

class Integer implements printable {

echo (int ) $this -> value ;

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

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

P.S. — Большая часть статьи — не моя, а взята из книги, где, на мой взгляд, наиболее понятно описана разница между абстрактными классами и интерфейсами.
P.P.S. — Так же, не особо понятно зачем вообще нужно ООП в PHP, т.к. прям явных преимуществ я не вижу, а все это можно реализовать с помощью простых функций… Единственный раз, когда я за свою жизнь использовал ООП — это для реализации класса, работающего с базами данных.

Для начала нужно сразу понять, что интерфейс это частный случай класса. Но в Java оно имеет отдельное ключевое слово, а в C++ это просто класс без реализации. Поэтому интерфейс просто задает некий стандарт для работы с кучей разнообразных реализаций.

Например, интерфейс Iterable говорит, что классы реализующие данный интерфейс имеют элементы и их можно перебирать в цикле вызывая метод next(). А значит, если создаете какой-то контейнер или коллекцию, то можно реализовать Iterable. Не выдумывая свои методы для работы с контейнером. Тем самым появляется некий общий стандарт - интерфейс для работы с контейнерами.

А если вы делаете игру, то можете создать интерфейс Unit, тем самым задав классам определенное поведение. Например, unit должен обязательно иметь метод atack(), isDead() и т.д.

Ну и конечно Unit может быть и просто классом или абстрактным классом, в котором реализованы atack и isDead, а может быть только isDead, потому что attack у каждого типа юнита индивидуально и требует собственной реализации. Т.е. приходим к тому, что интерфейс это также частный случай абстрактного класса.

Т.е. тут уже вступает в действие полиформизм, т.е. интерфейсы по сути дают полиформизм. Ну, а в Java они еще позволяют делать множественное наследование или другими словами задать классу несколько свойств поведения, например Unit может быть также и Iterable, тем самым можно дать юнитам инвентарь и перебирать элементы в нем.

И соответсвенно если Unit у вас будет классом или абстрактным классом, то унаследовав Unit в Java, вы просто не сможете дать наследнику еще и Iterable поведение, если Iterable будет тоже классом.

OrcWarrior implements Unit, Iterable - так можно

OrcWarrior extends Unit, Iterable - так в Java нельзя, но можно в С++, а Unit и Iterable тогда всегда будут объявляться как class...

Из-за этого, в Java приветствуется не наследование, а композиция. Т.е. нафига каждый раз реализовывать Unit.isDead, если он стандартный? Поэтому, создается скажем класс UnitAI и делается следующее:

Class OrcWarrior implements Unit, Iterable {
UnitAI ai;

UnitAI getAI(){
return ai;
}
}

Boolean isDead() {
....
}
}

Interface Unit {
void attack();
UnitAI getAI();
}

Вот это называется композиция, т.е. в OrcWarrior, HumanWarrior вы подмешиваете UnitAI, в котором уже реализовано isDead, и тем самым не нужно каждый раз его реализовывать одним и тем же кодом. В С++ такого можно не делать, там есть поддержка множественного наследование, но оно имеет свои минусы. Впрочем, как и композиция имеет плюсы/минусы.

Обсуждая с различными людьми - в большинстве своём опытными разработчиками - классический труд «Приёмы объектно-ориентированного проектирования. Паттерны проектирования» Гаммы, Хелма и др., я с изумлением встретил полное непонимание одного из базовых подходов ООП - различия классов и интерфейсов.

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

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

Главное отличие класса от интерфейса - в том, что класс состоит из интерфейса и реализации .

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

Кроме этого интерфейса, у класса есть также реализация - методы Вставить, Повернуть, Вынуть и их вызов в методе Открыть. Наследники Ключа наследуют вместе с интерфейсом и реализацию.

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

Но, предположим, некоторые двери открываются не таким вот поворотным ключом, а магнитной карточкой - которая ведь тоже по своей сути ключ! Интерфейс этой карточки никак принципиально не отличается от интерфейса обычного ключа - можно Открыть ключом, а можно Открыть карточкой.

И мы хотим сделать класс Магнитную Карточку, который тоже будет содержать интерфейс Ключа. Для этого мы унаследуем Магнитную Карточку от Ключа. Но вместе с интерфейсом унаследовалась и реализация, которая в методе Открыть вызывает методы Вставить, Повернуть и Вынуть - а это совершенно не подходит для Магнитной Карточки.

Нам придётся самое меньшее перегружать в Магнитной Карточке реализацию метода Открыть, используя уже последовательность Вставить, Провести и Вынуть. Это уже плохо, потому что мы не знаем детали реализации класса Ключ - вдруг мы упустили какое-то очень важное изменение данных, которое должно было быть сделано - и было сделано в методе Ключ:: Открыть? Нам придётся лезть во внутреннюю реализацию Ключа и смотреть, что и как - даже если у нас есть такая техническая возможность (open source навсегда и так далее), это грубое нарушение инкапсуляции, которое ни к чему хорошему не приведёт.

Именно так и пишут Гамма и др.: наследование является нарушением инкапсуляции .

Можете попробовать самостоятельно поразмышлять над такими вопросами:
- Что делать с тем фактом, что Ключ вставляется просто в скважину, а Магнитная Карточка - обязательно сверху (не посередине и не снизу)?
- Что делать, когда нам понадобиться сделать Бесконтактную Карточку, которую надо не вставлять, а подносить?

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

Мы должны опираться на интерфейсы, а не классы.

Объявим интерфейс Ключ, содержащий метод Открыть.

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

Объявим класс Магнитная Карточка, тоже реализующий интерфейс Ключ, но уже по-своему - и без каких-либо неприятных пересечений с реализацией Поворотного Ключа. Этого помогло нам достичь отделение интерфейса от реализации.

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

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

Когда мы мыслим классами - уподобляемся животным. Люди мыслят (и программируют) интерфейсами.

Использование интерфейсов даёт большие возможности. Например, класс может реализовывать несколько интерфейсов: класс Ключ-от-Домофона может содержать интерфейсы Ключ и Брелок.

Что касается наследования классов, которое, как вы помните, нарушает инкапсуляцию - часто вместо наследования лучше использовать делегирование и композицию . Не забыли Бесконтактную Карточку? Так хочется сделать её родственной Магнитной Карточке! (Например, чтобы знать, что их обе можно положить в Отделение-для-Карточек в Бумажнике.) Однако у них, кажется, нет ничего общего: интерфейс Ключ их роднит в той же мере, что и Поворотный Ключ с Ключом-от-Домофона.

Решение? Делаем класс (а может, и интерфейс - подумайте, что здесь подойдёт лучше) Карточка, реализующий интерфейс Ключ за счёт делегирования Магнитной Карточке либо же Бесконтактной Карточке. А чтобы узнать, что такое делегирование и композиция, а так же при чём тут абстрактная фабрика - обратитесь к книгам, посвящённым паттернам проектирования.

У использования интерфейсов вместо классов есть ещё много преимуществ. Вы сами сможете увидеть их на практике. Оставайтесь людьми!

P.S. К моему удивлению, я не смог найти на «Хабрахабре» ни блога, посвящённого ООП, ни блога, посвящённого программированию в целом. Если они есть - укажите, пожалуйста, а пока за неимением лучших вариантов размещаю в персональном блоге.