Не совсемо понятно в каких случае их использовать.
_____________
REANIMATOR
3.02.2009 - 05:43
в тех случаях когда ты хочешь обязать какой либо класс использовать определённые методы...
т.е. если метод print() присутствует в интерфейсе- он должен осуществляться в классе
да, задает каркас класса - набор определенных обязательных методов
_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
Для чего нужно обязывать класс использовать определенные методы?
Класс ведь и без этого прекрасно может работать. Вы что то недоговариваете:)
_____________
BRP
В принципе не для чего. Это также как и ООП - его можно и не использовать, и писать любые предложения. Так же и пользовательские функции - их можно не использовать. Понимаешь?
_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
понимаю.
на практике где их чаще всего применяют?
_____________
1. Отделение интерфейса от его реализации позволяет убрать загромождение кода, придавая интерфейсу удобный наглядный вид, своего рода типа "документирование".
2. Предопределенный функционал. Мы знаем, что все классы, реализуемые от интерфейса должны обязательно содержать какие-то методы или свойства (у каждого свои)
Т.е. своего рода "удобство", как и абстрактные классы. Абстрактные тока могут содержать реализацию методов, тогда как интерфейсы - нет.
Используются в больших проектах (хотя не факт), в командной разработке.
_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
Sylex разъяснил, спасибо.
_____________
LoneCat
6.02.2009 - 23:25
Чего тут разъяснять-то, на примере паттерна "Команда" все имхо предельно ясно:
PHP |
/* Интерфейс команды */ interface iCommand { public function execute(); }
/* Класс, каким-либо неведомым способом использующий эти команды */ class Executor {
/* Метод с typehinting интерфейса iCommand */ public function executeCommand(iCommand $command) { $command->execute(); }
} |
Итого класс Executor принимает в метод executeCommand объект команды, засчет typehinting он объект не реализующий этот интерфейс не пропустит (выдаст ошибку что передан неправильный тип аргумента метода), а интерфейс в свою очередь обязывает объект реализовывать метод execute (интерпритатор выдаст ошибку если объявленный в интерфейсе метод не будет реализован). Если-бы ни интерфейса, ни typehinting по нему не было-бы, то метод executeCommand мог-бы принять любой какой угодно объект (или даже не объект вовсе), в котором могло-бы не оказаться метода execute, и что соот-но вызвало-бы ошибку исполнения, более трудноуловимую нежели вышеописанные ошибки интерфейса и typehinting'а, в которых носом тыркают туда где ты что-то забыл.
З.Ы. Пример простейший, в данном случае смысл паттерна "команда" может быть не совсем ясен, но не о нем ведь речь, вообще для большей понятности - метод принимающий объект команды мог-бы например складировать их в приватное свойство объекта Executor, а потом по второму методу запускать все добавленные команды подряд.
т.е. освобождаемся от проверки через instanceof
Цитата (LoneCat @ 7.02.2009 - 01:25) |
а интерфейс в свою очередь обязывает объект реализовывать метод execute (интерпритатор выдаст ошибку если объявленный в интерфейсе метод не будет реализован). |
это по-моему наиболее важно
_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
к примеру я имею класс для работы с новостями CNews, который содержит методы:
Add()
Update()
Remove()
RemoveSelected()
...
и еще какие-то
И к примеру есть класс CArticles - статьи, который тоже содержит такие же методы, только с разной реализацией + доп. методы. Можно использовать интерфейс, на базе которых будут реализовываться и другие классы в подобной схеме. Имена методов у нас будут везде одинаковыми, а не так, что: в одном AddOne, в другом - AddRecord, в третьем - Add, в четвертом - PublicationAddToDB и т.д.
_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
Интерфейсы применяют в компилируемых языках для реализации
полиморфизма.
В PHP с его
утиной типизацией для реализации полиморфизма они не являются обязательными. Добавлены для удобства и привычности.
В то же время через них реализованы различные интересные фишки, см.
SPL.
_____________
Блог ГО |
Таблица символов Юникода |
Графомания
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.