Зачем нужна сущность интерфейс?

Статус
В этой теме нельзя размещать новые ответы.

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Активист, зачем? Я обосновал свое мнение, что ты у нас не последняя инстанция.
 

Вурдалак

Продвинутый новичок
Чего в PHP реально не хватает для избавления от некоторого рода копипасты — так это Generics (Java, C#). В PHP нельзя написать нормальную реализацию того же Specification<User> или Collection<User>.

А трейты — не. Ни одного валидного кейса. Неа. :)
 

HraKK

Мудак
Команда форума
Дааа я люблю Generics!!!
Пол царства за дженерики.


Из Киева, но слова и аргументы 1 в 1 мои. Я не верю что это совпадение. Какой город?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Вурдалак, тихо сам с собою, жизнь - дерьмо, все бабы ...? :)
c0dex, ни дня без спора с Активистом? )))

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

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

HraKK

Мудак
Команда форума
Вот бывает же такие совпадения.

Ответ один - интерфейсы это понятие больше филосовское. Между интерфейсом и абстрактным классом нет разницы как таковой(как правильно сказали в С++ для интерфейсов юзают классы).
Множественное наследование вообще не относиться к этому вопросу. Никак. Вообще.
Интерфейс это контракт который говорит как можно юзать этот класс. Без него любой класс вообще нельзя юзать, ибо он закрыт от внешнего мира инкапсуляцией.
Причем интерфейс может быть пустым - маркером. Он говорит что этот класс можно использовать как например ICollectable. Но не иметь не одного метода. Юзается для сигнатур.
А абстрактный класс - это лишь общая реализация. Она ничего не говорит о там как можно юзать этот класс. Это внутренняя часть класса. А интерфейс внешняя.

Как то так.
 

Активист

Активист
Команда форума
Вот бывает же такие совпадения.

Ответ один - интерфейсы это понятие больше филосовское. Между интерфейсом и абстрактным классом нет разницы как таковой(как правильно сказали в С++ для интерфейсов юзают классы).
Множественное наследование вообще не относиться к этому вопросу. Никак. Вообще.
Интерфейс это контракт который говорит как можно юзать этот класс. Без него любой класс вообще нельзя юзать, ибо он закрыт от внешнего мира инкапсуляцией.
Причем интерфейс может быть пустым - маркером. Он говорит что этот класс можно использовать как например ICollectable. Но не иметь не одного метода. Юзается для сигнатур.
А абстрактный класс - это лишь общая реализация. Она ничего не говорит о там как можно юзать этот класс. Это внутренняя часть класса. А интерфейс внешняя.

Как то так.
В дополнение мое имхо, интерфейсы это гарантия реализации того или иного набора методов и возможность определить наличие реализации этих методов в конкретном объекте, например, ситуация с интераторами ясно дает понять где и как их применять.
 
  • Like
Реакции: AmdY

HraKK

Мудак
Команда форума
это гарантия реализации того или иного набора методов
PHP:
abstract function getSome(){}
Тоже гарантирует что в конкретном классе будет конкретный метод и его реализация.

Так что нет. Это тоже не относится к данному вопросу.
 

Активист

Активист
Команда форума
PHP:
abstract function getSome(){}
Тоже гарантирует что в конкретном классе будет конкретный метод и его реализация.

Так что нет. Это тоже не относится к данному вопросу.
Как раз относится. Потому что объект может включать в себя как Interator, так и Serializable например, а вот с абстрактным классом вы сделать это уже не сможете.
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума
И что? Занаследовал два абстрактных класса Iterator и Serializable и профит. Не?
нет, нужно через промежуточный класс

PHP:
interface Foo {}
interface Bar {}

class Test implements Foo, Bar {}
//
abstract class Foo {}
abstract class Bar {}

class Proxy extends Foo {}
class Proxy2 extends Bar {}
class Test extends Proxy2 {}
 

HraKK

Мудак
Команда форума
Расскажи мне это в С++. Там просто взял и занаследовал. Разговор идет о проектировании, а не о частной реализации пхп
 

AmdY

Пью пиво
Команда форума
HraKK, так наличие множественного наследования и есть причина по которой в C++ нет смысла в интерфейсах как отдельной сущности.
 

HraKK

Мудак
Команда форума
Тут вопрос не в наличии отдельной сущности, а в том в чем отличие интерфейса и абстрактного класса. И в с++ это отличие самое правильное - на уровне философии, что я расписывал. В ПХП из-за множественного наследования можно ложно подумать что различие еще и в этом, но это не правда.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
терминологический спор - идиотизм сам по себе; инженер берет значения терминов в литературе и словарях,
в противном случае я бы предложил перейти на хабр к темам попроще :)

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

«наследование интерфейса» отличается от «наследования реализации»
фабричный метод определяет интерфейс для создания объектов
Текучий интерфейс придуман Эриком Эвансом и Мартином Фаулером — способ реализации, нацеленный на повышение читабельности исходного кода программы.
Конечно, роль контроллера в MVC у каждого своя )) (влом искать тот эпический спор), я это уважаю, но в данном случае PHP ничем не отличается от java. Было бы неплохо аргументировать доводы примерами и цитатами признанных источников, а не личным мнением.

Этот вопрос по сути хорош тем, что к его пониманию приходишь только отрефакторив пару проектов. Его невозможно выучить, а трактование говорит много о реальном опыте человека, с какими задачами он сталкивался.
 
Последнее редактирование:

Активист

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

На что HraKK заявил:

PHP:
abstract function getSome(){}
Тоже гарантирует что в конкретном классе будет конкретный метод и его реализация.
Так что нет. Это тоже не относится к данному вопросу.
Прочитайте хоть пару первых абзацев мануала, которые уже перевели на русский, где четко написано зачем нужны интерфейсы.

PS: интерфейсы не наследуются, а имплементируются.
PSS: интерфесы - это не сферическое абстрактное понятие, а конкретный механизм для реализации конкретных задач.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Активист, Я тебе про Фому, ты мне - "прочитай про Ерему".
Из определения в мануале "Интерфейсы позволяют указывать, какие методы и свойства должен включать класс" прямо не следует, что "интерфейсы нужны для того чтобы указывать ...".
Я толкованием библии не занимаюсь, я инженер, для меня MAY и MUST - разные директивы.

Есть интерфейс как термин программирования, есть - структура языка php.
Большинство инженеров в мире понимает интерфейс как абстрактное понятие, а php-кодеры - в узком смысле, как языковую конструкцию php, ибо ничего, кроме доки по php не читали.
В php реализация интерфейса гарантирует публичную сигнатуру, поэтому я считаю, что интерфейс в php - это инструмент валидации кода. Но вопрос был о другом :)

Прикол вопроса ТС в том, что по мануалу php ответить невозможно, нужно понимание сути концепции интерфейсов как формы общения между людьми.

Кстати,
PS: интерфейсы не наследуются, а имплементируются.
PSS: интерфесы - это не сферическое абстрактное понятие, а конкретный механизм для реализации конкретных задач.
И наследуются, и реализуются. 6й абзац в мануале по твоей ссылке.
И сферическое понятие в вакууме, и конкретный элемент языка. Так часто бывает.
 
Последнее редактирование:

Активист

Активист
Команда форума
Активист, Я тебе про Фому, ты мне - "прочитай про Ерему".
Из определения в мануале "Интерфейсы позволяют указывать, какие методы и свойства должен включать класс" прямо не следует, что "интерфейсы нужны для того чтобы указывать ...".
..
И наследуются, и реализуются. 6й абзац в мануале по твоей ссылке.
И сферическое понятие в вакууме, и конкретный элемент языка. Так часто бывает.
Хм.. Как-то мы по разному вами читаем русский язык.
Интерфейсы объектов позволяют создавать код, который указывает, какие методы и свойства должен включать класс, без необходимости описывания их функционала.
PS. Интерфейс может быть унаследован от другого базового интерфейса, но в объект (класс) они все же имплементируются ;)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху