@Giperoglif

Зачем интерфейсы если есть трэйты?

Суть вопроса сугубо философская, наверное. Но я немного недопонимаю(

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

interface ITestInterface
{
    public function a();

    public function b();

    public function c();
}

trait TestTrait
{
    abstract public function a();

    abstract public function b();

    abstract public function c();
}

class A implements ITestInterface
{

}

class B
{
use TestTrait;
}


в чем разница тут если их наследует класс C
  • Вопрос задан
  • 332 просмотра
Решения вопроса 1
AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"
Зачем нужны машины, если есть трамваи?

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

Макет класса, в свою очередь, можно принимать в параметры методов и сам макет предназначен что бы изолировать часть класса и не создавать лишних зависимостей. Зависимость на Абстракциях. Нет зависимости на что-то конкретное.

Представь, у тебя есть класс А с методами M1 и M2, с которым работают 3 других класса. Первый класс использует только метод M1, второй только метод М2, третий M1 и M2. Если ты просто передашь им в параметры класс А, то первые 2 класса будут зависеть от методов которые они не используют. Какой выход? Создай 3 интерфейса - для каждого класса и передавай их. Тогда классы использующие класс А не будут зависеть от того что не используют.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега PHP
Вопрос действительно философский.
Интерфейс - это публичный контракт. Соглашение. "Данный класс обязается делать это и это, и если соглашение подписано, то всегда можно ожидать выполнение классом таких обязанностей". А как он это делает - это его личные половые трудности. То есть интерфейс - это такое министерство иностранных дел класса, отдел внешних сношений. Фасад, вывеска.

Абстрактный класс и трейт - это министерство внутренних дел.
Абстрактный класс - это внутренний контракт. Чертеж, прототип, по которому строится класс. Включает внутреннюю кухню, которую посторонним знать не обязательно.
Трейт - просто повторное использование кода. Возможность нескольким классам использовать один и тот же код.
Ответ написан
delphinpro
@delphinpro
frontend developer
Про публичные контракты уже написали. Небольшой пример.
Я пишу класс. Он должен принимать в конструктор объект определенного типа:

class Me {
  public function __construct(IHttpRequest $request){

  }
}


Как я могу то же самое написать, используя абстрактные трейты?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы