Ранее сегодня я занимался исследованиями абстрактных классов , интерфейсов и черт PHP.
Насколько я могу судить, абстрактный класс говорит, что «все, что использует меня, будет использовать эти методы и атрибуты», интерфейсы говорят, что «все, что использует меня, должно иметь эти методы и атрибуты», и черты говорят, что «все, что меня использует, также будет иметь эти методы и атрибуты ".
Теперь, на мой вопрос, если вы получаете эквивалент абстрактного класса, когда используете интерфейс и черту, почему существуют абстрактные классы?
Если я ошибаюсь, и интерфейс и черта не являются эквивалентом абстрактного класса, можете ли вы объяснить, почему это не так?
Я думаю, что есть какая-то философская разница в том, как и когда их использовать.
Ты сказал :
Если вы сосредоточены на своих собственных формулировках, это имеет смысл.
Абстрактные классы на самом деле определяют абстрактные вещи, например, транспортное средство – абстрактная вещь до тех пор, пока она не будет материализована в виде автомобиля или велосипеда. Ни один из интерфейсов не определяет его или черты.
Интерфейсы дополняют функциональность наследования класса, где класс наследуется от нескольких классов (только определенные языки предоставляют множественное наследование, например, C / C ++). Интерфейсы, поскольку имена предполагают сосредоточиться на INTERFACE, а не на реализации метода интерфейса в классе, который его реализует. Он делает классы PLUG & PLAYABLE, поэтому каждый должен следовать стандарту . Если вы прочтете о фабрике и шаблоне адаптера на ООП, вы поймете это.
Черты имеют реализацию / функциональность, которая не связана с конкретными классами. Вместо этого ее можно найти в разных классах. Это похоже на ген в генетике, который остается немым в родителях и появляется только у некоторых детей. Или быть кратким выборочным наследованием, но не привязанным к одному классу. Таким образом, он обеспечивает намного лучший способ повторного использования кода
Edit Interface + Trait! = Abstract Class, потому что при использовании наследования Trait является selective
когда вы выбираете конкретный признак для использования, и при использовании наследования Abstract Class
обязательно или диктуется родительским классом, у вас нет свободы!
Это немного похоже на высказывание, если существуют float, почему существуют целые числа, они оба выполняют свои собственные конкретные задачи, но, что более важно, посмотрите на историю PHP, чтобы пролить свет на это:
PHP был первоначально построен без какой-либо поддержки для классов, и с течением времени все больше и больше было добавлено для расширения возможностей PHP, поскольку мы продвигаем его все дальше и дальше (и спорная игра догоняет другие языки на основе ООП)
2004 – Представлены абстрактные классы и интерфейсы
2012 – введены черты
Это 8-летний перерыв, в то время, между прочим, возникла необходимость добавить поддержку интерфейсов с реализациями , и поэтому черта родилась
Когда вы используете черты, вам просто нужен определенный класс для реализации некоторых методов.
Вы не наследуете никаких свойств или методов, и вы не будете вынуждать объект в какое-либо дерево наследования.
Таким образом, у вас может быть несколько совершенно несвязанных классов, использующих один и тот же признак, чтобы гарантировать, что любой объект классов тезисов будет поддерживать данный метод.
это то, как PHP делает знаменитые Mixins. В основном Mixin – это просто класс, который может делиться общими чертами с несколькими другими классами. Черты позволяют принудительно применять это ограничение к методам классов, независимо от того, как эти классы наследуют друг от друга или нет.
Вместо того, чтобы делать множественные наследования до глупости, когда вы хотите, чтобы класс сочетал поведение двух родителей, вы можете использовать черты, чтобы получить тот же результат, без хлопот, вставляя кучу нежелательных других вещей.