Абстрактные методы и классы




PHP поддерживает определение абстрактных классов и методов. Абстрактные классы могут содержать описание абстрактных методов. Для таких методов указывается лишь заголовок с ключевым словом abstract и всеми прочими атрибутами, указываемыми при объявлении метода. Абстрактные методы не имеют тела или реализации, они лишь описывают, что должен уметь делать объект, а как он это будет делать – проблема наследников абстрактного класса. Класс, в котором объявлен хотя бы один абстрактный метод, должен также быть объявлен абстрактным.

В абстрактном классе можно объявлять так же и обычные методы и поля, которые могут быть унаследованы.

Экземпляр абстрактного класса создавать нельзя, так как в противном случае могла произойти попытка вызвать от этого экземпляра абстрактный метод, что абсурдно, так как он не имеет реализации.

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

Объявление абстрактного класса начинается с ключевого слова abstract.

Пример:

В примере создается абстрактный класс Car, имеющий обычное поле ($petrol) и метод (startEngine()), а также абстрактный метод (stopEngine()). Теперь класс, унаследованный от класса Car, обязан будет содержать реализацию метода stopEngine() или тоже должен быть объявлен как абстрактный, в противном случае еще до начала выполнения скрипта произойдет ошибка. В нашем случае дочерний класс InjectorCar содержит метод stopEngine() и описывает его действия.

Задание 9

1. Создайте абстрактный класс AUser;

2. В абстрактном классе AUser объявите абстрактный метод showInfo();

3. Обновите класс User, унаследовав его от абстрактного класса AUser;

4. Внесите в класс User необходимые изменения;

5. Запустите код и проверьте его работоспособность.

Интерфейсы

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

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

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

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

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

Стоит так же отметить ещё одно отличие интерфейсов от абстрактных классов – один класс может реализовывать сколь угодно много интерфейсов. Для этого их имена просто нужно перечислить через запятую после ключевого слова implements. Унаследовать же несколько абстрактных классов нельзя. Это связанно с тем, что в абстрактных классах могут содержаться различные реализации не абстрактных методов с одинаковыми именами, и при наследовании этих классов не ясно, какую реализацию унаследовать потомку. В интерфейсах же реализованные методы отсутствуют и, если класс имплементирует несколько интерфейсов, в которых содержаться абстрактные методы с одинаковыми именами, то какой из этих методов будет реализован в классе безразлично.

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

Пример:

В примере описаны два интерфейса (Hand, Foot) и методы, которые должны содержать наследники данных интерфейсов. Класс Human имплементирует оба интерфейса и уже содержит реализацию всех методов, заданных Интерфейсами.

Методы и классы final

Ключевое слово final позволяет помечать методы, чтобы наследующий класс не мог

перегрузить их. После объявления класса final он не может быть унаследован.

 

Задание 10

1. Создайте интерфейс ISuperUser;

2. В интерфейс ISuperUser объявите метод getInfo();

3. Опишите метод getInfo() в классе SuperUser;

4. Метод getInfo() должен возвращать ассоциативный массив, в котором именами ячеек являются имена свойств объекта, а значениями ячеек - значения свойств объекта;

5. Вызовите метод getInfo() для экземпляра класса SuperUser;

6. В цикле выведите данные, полученные с помощью метода getInfo().



Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


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