Интерфейсы. Взамен множественного наследования пришел другой, упрощенный метод: использование интерфейсов

Взамен множественного наследования пришел другой, упрощенный метод: использование интерфейсов. Интерфейс (interface) представляет собой обычный абстрактный класс, но только в нем не может быть свойств, и тела у всех методов не определены. Фактически некоторый интерфейс указывает лишь список методов, их аргументы и модификаторы доступа (обычно только protected и public). Допускается также описание констант внутри интерфейса с помощью ключевого слова const.

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

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

interface Shape {

public function show(); // тело не указывается!

}

interface Movement {

public function move (); // вращает объект

//класс Circle реализует интерфейсы Shape и Movement

class Circle implements Shape, Movement {

public function show () { ... }

public function move () { ... }

}

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

<?php ## Множественное наследование интерфейсов.

// Сущность: "материальный объект",

interface IWorldObject {

public function getCoord(); // возвращает координаты объекта

}

interface IWheeled {

public function getNumWheels(); // возвращает число колес

}

//интерфейс ITransport расширяет интерфейс IWorldObject

interface ITransport extends IWorldObject {

public function getNumPassengers(); // максимальное число пассажиров

}

//класс Audi реализует все три интерфейса, описанных выше

class Audi implements ITransport, IWheeled, IWorldObject {

private $coordArray;

public function getCoord() { return $coordArray; }

public function getNumWheels() { return 4; }

public function getNumPassengers() { return 5; }

}

?>

Интерфейс IWorldObjectрасширяется интерфейсом ITransport, который, в свою очередь, реализуется классом Audi. В то же время, Audiреализует IWorldObjectи напрямую. Получается, что у Audi имеются две реализации интерфейса "материальный объект": непосредственный и через "транспортное средство". Такая ситуация довольно типична и является совершенно корректной: если некоторый интерфейс реализуется дважды, то в действительности в классе имеется лишь одна "ссылка" на него. Таким образом, никакого конфликта нет.








Дата добавления: 2015-08-26; просмотров: 684;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.