Developers/Object oriented programming in PHP/Abstract classes and interfaces/ru

Абстрактные классы
Абстрактные классы можно создать при помощи ключевого слова abstract. Помимо применения методов public/protected/private/static, они также могут определять абстрактные методы, которые являются лишь калькой методов, которые должны быть реализованы.

К абстрактным классам применимы следующие правила:


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

Существует три причины использования классов abstract:


 * Если имеются методы, которые имеют различную реализацию.
 * Если константы должны быть общими для разных реализаций классов.
 * Если необходимо использовать шаблон проектирования шаблон/template.

Каждый класс item и manager в Arcavias дополняет абстрактный класс, например MShop_Common_Item_Abstract</tt> и MShop_Common_Manager_Abstract</tt> классы дополняются всеми item и manager:

Интерфейсы
Интерфейсы определяют, какие публичные/public методы должен реализовывать класс. Поэтому они предоставляют лишь названия методов и параметры в подписи, пропуская содержимое методов. Методы в интерфейсах определяются наподобие абстрактных</tt> методов в абстрактных</tt> классах, и интерфейсы гарантируют, что все реализуемые методы будут иметь те же параметры в подписи и будут вызываться однотипно.

К интерфейсам применимы следующие правила:


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

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

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

Разница между интерфейсами и абстрактными классами
Существует несколько небольших, но важных отличий между интерфейсами и абстрактными классами:


 * Интерфейсы могут дополнять сразу несколько интерфейсов, в то время как (абстрактные) классы могут дополнить лишь один единственный класс.
 * Все методы интерфейсов должны быть объявлены как public</tt>, а абстрактные методы могут быть либо public</tt>, либо protected</tt>, но не private</tt>.
 * Если интерфейс добавляется как тип параметра в метод интерфейса, то принимаются все объекты, реализующие данный интерфейс прямо или косвенно.

Смотрите также

 * http://php.net/manual/en/language.oop5.interfaces.php
 * http://php.net/manual/en/language.oop5.abstract.php

<< Назад: объекты | Далее: исключения >>