Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Помогите понять интерфейсы [2]
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Почитайте про API и то, какое удобство оно предоставляет. Представьте так же, что Вы проектом занимаетесь не водиночку. Ну и всякие модные (но от того не менее актуальные) понятия как масштабируемость, юзабилити, переносимость кода.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
caballero
Отправлено: 26 Сентября, 2011 - 10:17:01
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
А в остальных случаях всегда хватало абстрактного класса, множественное наследование нигде пока не пригодилось
Абстрактный клас не всегда подходит. Если столкнетесь на яве с серверами приложений и прочими продвинутыми фишками сразу все поймете. (Добавление)
Цитата:
Почитайте про API и то, какое удобство оно предоставляет.
Нет никакой прямой связи между API и интерфейсами. Большинство API (виндовс API, API для серверов БД) чисто функции. Наличие интерфейсов в API
не дало бы возможности работать с оным на разных языках программирования.
Цитата:
Ну и всякие модные (но от того не менее актуальные) понятия как масштабируемость, юзабилити, переносимость кода.
Набор модных слов из которых тоже не вытекает связь с интерфейсами.
Apache и Mysql написаны на простом С даже без классов не то что интерфейсов и замечательно масштабируются и переносятся. Более того именно потому они и написаны на голом C.
Классы и интерфейсы ограничивают применение в пределах одного языка программирования. Поэтому API на PHP или Java может быть использовано только PHP или Java.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Читайте внимательно. Здесь связь "причина"-"следствие", а не равносильность элементов.
И судя по
caballero пишет:
Нет никакой прямой связи между API и интерфейсами
Вы все же не читали об этом предмете, или читали невнимательно.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Stierus
Отправлено: 26 Сентября, 2011 - 15:33:26
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Цитата:
класс не поддерживает множественное наследование и для решения этой проблемы используют интерфейсы
Бред. Наследование - это класс-потомок приобретает методы и свойства родительского класса (уже реализованы конкретные методы, которыми можно пользоваться). Интерфейс - тупо шаблон, это декларативная вещь.
Пример для понимания:
есть функция test($stringToSave, saver $logger); у которой первый аргумент - строка, которую нужно сохранить, а второй аргумент - класс, который и будет сохранять. Что бы все это работало без сбоев, мы должны быть уверены, что вторым параметром функции пойдет именно объект класса, а не массив или еще одна строка, а помимо того, мы должны быть уверены что этот объект действительно сможет сохранить строку. Вот для этого и делаются интерфейсы:
test('test',$bred);//Тут будет ошибка, ибо SomeAnotheClass не поддерживает необходимый интерфейс
Отличие интрефейса от абстрактного класса ровно в том же - абстракный класс - это класс-родитель, от которого приобретаются свойства и методы + он может быть только один.
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
ясно понятно! всем спасибо за помощь, пока что вопросов нет...
MrBeard
Отправлено: 26 Сентября, 2011 - 16:38:45
Гость
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
Stierus пишет:
Бред. Наследование - это класс-потомок приобретает методы и свойства родительского класса (уже реализованы конкретные методы, которыми можно пользоваться). Интерфейс - тупо шаблон, это декларативная вещь.
Отличие от абстрактного класса - класс может быть один, сам написал). Ещё когда яву читал, так прямо было написано - интерфейсы вводились для организации аналога множественного наследования из C++. И да, интерфейсы, как и абстрактные классы, не могут содержать реализации методов, а только их объявление.
так что не монимаю, что не так в фразе
Цитата:
Интерфейсы введены для организации множественного наследования
Мелкий
Отправлено: 26 Сентября, 2011 - 17:13:40
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
Мелкий пишет:
Ну и, если пользуетесь интерфейсами, надо знать, что класс не может иметь интерфейсы с повторяющимися именами.
http://habrahabr.ru/blogs/php/116916/
смысл статьи - Я не понимаю, почему никому не нужная штука, которая, возможно, может привести к паре неприятностей при невнимательности, не работает? нет, ну мне правда очень нужна эта бесполезная штука!!
caballero
Отправлено: 26 Сентября, 2011 - 18:38:49
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
как и абстрактные классы, не могут содержать реализации методов,
абстрактные классы могут
не обязательно все методы должны быть абстрактными
более того класс может быть объявлен abstract не имея ни одного абстрактного метода (например если создание объекта базового класса не имеет смысла с точки зрения бизнес-логики)
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
различия между интерфейсом и абстрактным классом: абстрактный класс может иметь свойства и конструктор, что интерфейс иметь не может. и еще - если класс не реализует все методы интерфейса то класс следует определить абстрактным. абстрактный класс может и не иметь абстрактных методов. абстрактный класс может иметь реализацию методов а может и не иметь. нельзя создать экземпляр абстрактного класса, только наследовать его. вот что я выучил и понял сегодня еще понел полиморфизм но это уже не по теме
caballero
Отправлено: 26 Сентября, 2011 - 22:07:10
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
если класс не реализует все методы интерфейса то класс следует определить абстрактным
если класс не реализует все методы интерфейса то компилятор выдаст ошибку синтаксиса и чихать ему что ты там определил
Цитата:
вот что я выучил и понял сегодня
плохо выучил и толком ничего не понял
не сваливай в кучу абстрактные классы и интерфейсы
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
MrBeard, вы еще сами толком не понимаете разницу между этими понятиями, не надо людей учить тому, в чем сами плохо разбираетесь. Абстрактный класс - это обычный класс, единственная разница - нельзя создать экземпляр этого класса. Он может содержать, а может и не содержать абстрактные свойства и методы, он может иметь реализованныйе методы (зачастую имеет).
Интерфейс - это вообще другое, это не классы, не функции - это стандарт. Нельзя создать экземпляр стандарта, стандарт нужно поддерживать. Если класс реализует этот интерфейс - он лишь подписывается (гарантирует), что реализует все, что требует этот стандарт.
Bio man, возьмите книжку по php поновее и почитайте ее, там все доступно описано и расписано, можете зайти на php.net и посмотреть, что там пишут - много полезного найдете. Ответы на форуме не всегда пишут профессионалы и зачастую только запутывают новичков.
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
да, признаю, забыл уже о том, что в абстрактном классе может быть реализация методов(хотя сам это делал).
Bio man
Отправлено: 27 Сентября, 2011 - 07:42:38
Постоянный участник
Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010 Откуда: Даугавпилс, Латвия
Помог: 52 раз(а)
нащет абстрактных классов и интерфейсов - почему ввыдаст ошибку? Я сам не пробовал так делать, но в книжке русским языком было написано что если класс не реализует какие то методы интерфейса то его следует определить абстрактным. Может имелось ввиду что метод должен быть определен в абстрактном классе но может быть не реализован?
Stierus
Отправлено: 27 Сентября, 2011 - 09:24:54
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Имелось ввиду, что нужно объявить его абстрактным и в дочернем классе дописать все недостающее. Если класс имплементит интерфейс - никакими уловками ты не заставишь его работать, не реализовав в этом классе все, что требует интерфейс.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.