Интерфейсы, абстрактные классы

гемоглобин

Новичок
Интерфейсы, абстрактные классы

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

Тоже самое с абстрактными классами, если убрать из такого класса все абстрактные методы и убрать слово abstract, то все будет работать, так? Т.е. и абстрактные классы нужны только для читабельности?
 

Вурдалак

Продвинутый новичок
В PHP уже давненько появился Type Hinting, позволяющий в сигнатуре метода указать в качестве аргумента объект, реализующий некий интерфейс или относящийся к какому-то абстрактному (но необязательно) классу. Это как раз позволяет корректно реализовать расширяемый код, где можно объект одного класса заменить объектом другого класса (адаптер какой-то, например).
 

Вурдалак

Продвинутый новичок
гемоглобин, можно. ООП следуют не ради какого-то дополнительного функционала, а ради удобства.
 

гемоглобин

Новичок
Автор оригинала: Вурдалак
гемоглобин, можно. ООП следуют не ради какого-то дополнительного функционала, а ради удобства.
Ну, об этом я и спрашивал. Т.е. для читабельности. Ну и для IDE
 

rotoZOOM

ACM maniac
Т.е. для читабельности. Ну и для IDE
нет. Например, для гарантии того, что твой класс поддерживает необходимые методы с определенной сигнатурой.
Ты взял стороннюю библиотеку, где в один из методов одного из классов необходимо передать объект класса, реализующего интерфейс IComparable, который гарантирует наличие функции сравнения boolean isEqual (IComparable $object).
Разработчику библиотеки не надо теперь заботится о проверки наличия этого метода в переданном объекте.
Он в качестве параметра ставит IComparable и все.
 

гемоглобин

Новичок
Автор оригинала: rotoZOOM
Разработчику библиотеки не надо теперь заботится о проверки наличия этого метода в переданном объекте.
Он в качестве параметра ставит IComparable и все.
Не совсем понятно. Если создатель класса не реализует все необходимые методы, он получит ошибку. Но ведь и если не будет интерфейсов, и программист не реализует необходимые методы, то все равно он получит ошибку, только позже. Разница есть, но не такая уж существенная?
 

rotoZOOM

ACM maniac
Разница есть и существенная. Ошибки во время интерпретации отслеживаются быстрее, чем ошибки во время исполнения программы.
 

dimagolov

Новичок
"он получит ошибку" без интерфейса в момент ИСПОЛНЕНИЯ, который может возникать один раз на тысячу вызовов скрипта.
А с интерфейсом в момент КОМПИЛЯЦИИ в байт-код, который каждый раз.
 

tenshi

Новичок
и главное - ошибка будет указывать на точку передачи неправильного объекта, а не в точку, где один из его методов отваливается с ошибкой из-за того ему передали неправильные параметры
 

Ragazzo

TDD interested
гемоглобин
нафиг тему заводить , если в конце пишешь что все это не важно?троллим?
 

AmdY

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

гемоглобин

Новичок
Автор оригинала: Ragazzo
гемоглобин
нафиг тему заводить , если в конце пишешь что все это не важно?троллим?
Хочу разобраться. Я не против интерфейсов и абстрактных классов, просто хочу всё точно знать, может я что-то упускаю.
 

tenshi

Новичок
гемоглобин, вот погемороишься как нибудь пол дня с отладкой какой-нибудь глупейшей ошибки - поймёшь что заботливо расставленные заранее перила помогают не свалиться с лестницы ;-)
 

гемоглобин

Новичок
Ладно, тут похоже всё понятно.
Следующий вопрос. Когда применять.
Все ли классы должны реализовывать какой-то интерфейс? Или интерфейс нужен когда существуют два и более класса, которые должны его имплиментировать?
То же самое, про абстрактные классы. Всегда ли при наследовании родительский класс должен быть абстрактным?
 
Сверху