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
Форумы портала PHP.SU :: Версия для печати :: Помогите понять интерфейсы [2]
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Помогите понять интерфейсы

Страниц (3): « 1 [2] 3 »
 

16. EuGen - 26 Сентября, 2011 - 10:11:15 - перейти к сообщению
Почитайте про API и то, какое удобство оно предоставляет. Представьте так же, что Вы проектом занимаетесь не водиночку. Ну и всякие модные (но от того не менее актуальные) понятия как масштабируемость, юзабилити, переносимость кода.
17. caballero - 26 Сентября, 2011 - 10:17:01 - перейти к сообщению
Цитата:
А в остальных случаях всегда хватало абстрактного класса, множественное наследование нигде пока не пригодилось


Абстрактный клас не всегда подходит. Если столкнетесь на яве с серверами приложений и прочими продвинутыми фишками сразу все поймете.
(Добавление)
Цитата:
Почитайте про API и то, какое удобство оно предоставляет.

Нет никакой прямой связи между API и интерфейсами. Большинство API (виндовс API, API для серверов БД) чисто функции. Наличие интерфейсов в API
не дало бы возможности работать с оным на разных языках программирования.

Цитата:
Ну и всякие модные (но от того не менее актуальные) понятия как масштабируемость, юзабилити, переносимость кода.


Набор модных слов из которых тоже не вытекает связь с интерфейсами.
Apache и Mysql написаны на простом С даже без классов не то что интерфейсов и замечательно масштабируются и переносятся. Более того именно потому они и написаны на голом C.

Классы и интерфейсы ограничивают применение в пределах одного языка программирования. Поэтому API на PHP или Java может быть использовано только PHP или Java.
18. EuGen - 26 Сентября, 2011 - 10:30:34 - перейти к сообщению
Читайте внимательно. Здесь связь "причина"-"следствие", а не равносильность элементов.
И судя по
caballero пишет:
Нет никакой прямой связи между API и интерфейсами
Вы все же не читали об этом предмете, или читали невнимательно.
19. Stierus - 26 Сентября, 2011 - 15:33:26 - перейти к сообщению
Цитата:
класс не поддерживает множественное наследование и для решения этой проблемы используют интерфейсы
Бред. Наследование - это класс-потомок приобретает методы и свойства родительского класса (уже реализованы конкретные методы, которыми можно пользоваться). Интерфейс - тупо шаблон, это декларативная вещь.

Пример для понимания:

есть функция test($stringToSave, saver $logger); у которой первый аргумент - строка, которую нужно сохранить, а второй аргумент - класс, который и будет сохранять. Что бы все это работало без сбоев, мы должны быть уверены, что вторым параметром функции пойдет именно объект класса, а не массив или еще одна строка, а помимо того, мы должны быть уверены что этот объект действительно сможет сохранить строку. Вот для этого и делаются интерфейсы:

PHP:
скопировать код в буфер обмена
  1. interface saver {
  2. function log($string); // У всех классов, реализующих этот интерфейс, 100% будет ф-я log с одним аргументом
  3. }
  4.  
  5. class loggerInDb implements saver{
  6.     function log($string){
  7.         //тут сохранение строки в бд
  8.     }
  9. }
  10.  
  11. class loggerInFile implements saver{
  12. function log($string){
  13.         //тут сохранение строки в файл
  14.     }
  15. }
  16.  
  17. function test($stringToSave, saver $logger){
  18.     $logger->log($stringToSave);
  19. }
  20.  
  21. $fileSaver = new loggerInFile();
  22. $DbSaver = new loggerInDb();
  23. $bred = new SomeAnotheClass();
  24. test('test', $fileSaver);
  25. test('test', $DbSaver);
  26. test('test', $bred); //Тут будет ошибка, ибо SomeAnotheClass не поддерживает необходимый интерфейс
  27.  


Отличие интрефейса от абстрактного класса ровно в том же - абстракный класс - это класс-родитель, от которого приобретаются свойства и методы + он может быть только один.
20. Bio man - 26 Сентября, 2011 - 16:07:14 - перейти к сообщению
ясно понятно! всем спасибо за помощь, пока что вопросов нет...
21. MrBeard - 26 Сентября, 2011 - 16:38:45 - перейти к сообщению
Stierus пишет:
Бред. Наследование - это класс-потомок приобретает методы и свойства родительского класса (уже реализованы конкретные методы, которыми можно пользоваться). Интерфейс - тупо шаблон, это декларативная вещь.

Отличие от абстрактного класса - класс может быть один, сам написал). Ещё когда яву читал, так прямо было написано - интерфейсы вводились для организации аналога множественного наследования из C++. И да, интерфейсы, как и абстрактные классы, не могут содержать реализации методов, а только их объявление.
так что не монимаю, что не так в фразе
Цитата:
Интерфейсы введены для организации множественного наследования
22. Мелкий - 26 Сентября, 2011 - 17:13:40 - перейти к сообщению
Ну и, если пользуетесь интерфейсами, надо знать, что класс не может иметь интерфейсы с повторяющимися именами.
http://habrahabr[dot]ru/blogs/php/116916/
23. MrBeard - 26 Сентября, 2011 - 18:13:47 - перейти к сообщению
Мелкий пишет:
Ну и, если пользуетесь интерфейсами, надо знать, что класс не может иметь интерфейсы с повторяющимися именами.
http://habrahabr.ru/blogs/php/116916/

смысл статьи - Я не понимаю, почему никому не нужная штука, которая, возможно, может привести к паре неприятностей при невнимательности, не работает? нет, ну мне правда очень нужна эта бесполезная штука!!
24. caballero - 26 Сентября, 2011 - 18:38:49 - перейти к сообщению
Цитата:
как и абстрактные классы, не могут содержать реализации методов,


абстрактные классы могут
не обязательно все методы должны быть абстрактными
более того класс может быть объявлен abstract не имея ни одного абстрактного метода (например если создание объекта базового класса не имеет смысла с точки зрения бизнес-логики)
25. Bio man - 26 Сентября, 2011 - 20:30:05 - перейти к сообщению
различия между интерфейсом и абстрактным классом: абстрактный класс может иметь свойства и конструктор, что интерфейс иметь не может. и еще - если класс не реализует все методы интерфейса то класс следует определить абстрактным. абстрактный класс может и не иметь абстрактных методов. абстрактный класс может иметь реализацию методов а может и не иметь. нельзя создать экземпляр абстрактного класса, только наследовать его. вот что я выучил и понял сегодня Радость еще понел полиморфизм но это уже не по теме Улыбка
26. caballero - 26 Сентября, 2011 - 22:07:10 - перейти к сообщению
Цитата:
если класс не реализует все методы интерфейса то класс следует определить абстрактным


если класс не реализует все методы интерфейса то компилятор выдаст ошибку синтаксиса и чихать ему что ты там определил


Цитата:
вот что я выучил и понял сегодня

плохо выучил и толком ничего не понял

не сваливай в кучу абстрактные классы и интерфейсы
27. Stierus - 26 Сентября, 2011 - 22:20:40 - перейти к сообщению
MrBeard, вы еще сами толком не понимаете разницу между этими понятиями, не надо людей учить тому, в чем сами плохо разбираетесь. Абстрактный класс - это обычный класс, единственная разница - нельзя создать экземпляр этого класса. Он может содержать, а может и не содержать абстрактные свойства и методы, он может иметь реализованныйе методы (зачастую имеет).

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


Bio man, возьмите книжку по php поновее и почитайте ее, там все доступно описано и расписано, можете зайти на php.net и посмотреть, что там пишут - много полезного найдете. Ответы на форуме не всегда пишут профессионалы и зачастую только запутывают новичков.
28. MrBeard - 27 Сентября, 2011 - 06:41:52 - перейти к сообщению
да, признаю, забыл уже о том, что в абстрактном классе может быть реализация методов(хотя сам это делал).
29. Bio man - 27 Сентября, 2011 - 07:42:38 - перейти к сообщению
нащет абстрактных классов и интерфейсов - почему ввыдаст ошибку? Я сам не пробовал так делать, но в книжке русским языком было написано что если класс не реализует какие то методы интерфейса то его следует определить абстрактным. Может имелось ввиду что метод должен быть определен в абстрактном классе но может быть не реализован?
30. Stierus - 27 Сентября, 2011 - 09:24:54 - перейти к сообщению
Имелось ввиду, что нужно объявить его абстрактным и в дочернем классе дописать все недостающее. Если класс имплементит интерфейс - никакими уловками ты не заставишь его работать, не реализовав в этом классе все, что требует интерфейс.

 

Powered by ExBB FM 1.0 RC1