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]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: не доходит мне
EuGen Администратор
Отправлено: 26 Сентября, 2011 - 10:11:15
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Почитайте про API и то, какое удобство оно предоставляет. Представьте так же, что Вы проектом занимаетесь не водиночку. Ну и всякие модные (но от того не менее актуальные) понятия как масштабируемость, юзабилити, переносимость кода.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 26 Сентября, 2011 - 10:17:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
А в остальных случаях всегда хватало абстрактного класса, множественное наследование нигде пока не пригодилось


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

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

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


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

Классы и интерфейсы ограничивают применение в пределах одного языка программирования. Поэтому API на PHP или Java может быть использовано только PHP или Java.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
EuGen Администратор
Отправлено: 26 Сентября, 2011 - 10:30:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Читайте внимательно. Здесь связь "причина"-"следствие", а не равносильность элементов.
И судя по
caballero пишет:
Нет никакой прямой связи между API и интерфейсами
Вы все же не читали об этом предмете, или читали невнимательно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Stierus Супермодератор
Отправлено: 26 Сентября, 2011 - 15:33:26
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




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

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

есть функция 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.  


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

(Отредактировано автором: 26 Сентября, 2011 - 15:37:09)

 
My status
 Top
Bio man
Отправлено: 26 Сентября, 2011 - 16:07:14
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




ясно понятно! всем спасибо за помощь, пока что вопросов нет...
 
 Top
MrBeard
Отправлено: 26 Сентября, 2011 - 16:38:45
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011  


Помог: 2 раз(а)




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

Отличие от абстрактного класса - класс может быть один, сам написал). Ещё когда яву читал, так прямо было написано - интерфейсы вводились для организации аналога множественного наследования из C++. И да, интерфейсы, как и абстрактные классы, не могут содержать реализации методов, а только их объявление.
так что не монимаю, что не так в фразе
Цитата:
Интерфейсы введены для организации множественного наследования
 
 Top
Мелкий Супермодератор
Отправлено: 26 Сентября, 2011 - 17:13:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ну и, если пользуетесь интерфейсами, надо знать, что класс не может иметь интерфейсы с повторяющимися именами.
http://habrahabr[dot]ru/blogs/php/116916/


-----
PostgreSQL DBA
 
 Top
MrBeard
Отправлено: 26 Сентября, 2011 - 18:13:47
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011  


Помог: 2 раз(а)




Мелкий пишет:
Ну и, если пользуетесь интерфейсами, надо знать, что класс не может иметь интерфейсы с повторяющимися именами.
http://habrahabr.ru/blogs/php/116916/

смысл статьи - Я не понимаю, почему никому не нужная штука, которая, возможно, может привести к паре неприятностей при невнимательности, не работает? нет, ну мне правда очень нужна эта бесполезная штука!!
 
 Top
caballero
Отправлено: 26 Сентября, 2011 - 18:38:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
как и абстрактные классы, не могут содержать реализации методов,


абстрактные классы могут
не обязательно все методы должны быть абстрактными
более того класс может быть объявлен abstract не имея ни одного абстрактного метода (например если создание объекта базового класса не имеет смысла с точки зрения бизнес-логики)

(Отредактировано автором: 26 Сентября, 2011 - 18:39:33)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Bio man
Отправлено: 26 Сентября, 2011 - 20:30:05
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




различия между интерфейсом и абстрактным классом: абстрактный класс может иметь свойства и конструктор, что интерфейс иметь не может. и еще - если класс не реализует все методы интерфейса то класс следует определить абстрактным. абстрактный класс может и не иметь абстрактных методов. абстрактный класс может иметь реализацию методов а может и не иметь. нельзя создать экземпляр абстрактного класса, только наследовать его. вот что я выучил и понял сегодня Радость еще понел полиморфизм но это уже не по теме Улыбка
 
 Top
caballero
Отправлено: 26 Сентября, 2011 - 22:07:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
если класс не реализует все методы интерфейса то класс следует определить абстрактным


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


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

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

не сваливай в кучу абстрактные классы и интерфейсы

(Отредактировано автором: 26 Сентября, 2011 - 22:07:58)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Stierus Супермодератор
Отправлено: 26 Сентября, 2011 - 22:20:40
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




MrBeard, вы еще сами толком не понимаете разницу между этими понятиями, не надо людей учить тому, в чем сами плохо разбираетесь. Абстрактный класс - это обычный класс, единственная разница - нельзя создать экземпляр этого класса. Он может содержать, а может и не содержать абстрактные свойства и методы, он может иметь реализованныйе методы (зачастую имеет).

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


Bio man, возьмите книжку по php поновее и почитайте ее, там все доступно описано и расписано, можете зайти на php.net и посмотреть, что там пишут - много полезного найдете. Ответы на форуме не всегда пишут профессионалы и зачастую только запутывают новичков.

(Отредактировано автором: 26 Сентября, 2011 - 22:23:27)

 
My status
 Top
MrBeard
Отправлено: 27 Сентября, 2011 - 06:41:52
Post Id



Гость


Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011  


Помог: 2 раз(а)




да, признаю, забыл уже о том, что в абстрактном классе может быть реализация методов(хотя сам это делал).
 
 Top
Bio man
Отправлено: 27 Сентября, 2011 - 07:42:38
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




нащет абстрактных классов и интерфейсов - почему ввыдаст ошибку? Я сам не пробовал так делать, но в книжке русским языком было написано что если класс не реализует какие то методы интерфейса то его следует определить абстрактным. Может имелось ввиду что метод должен быть определен в абстрактном классе но может быть не реализован?
 
 Top
Stierus Супермодератор
Отправлено: 27 Сентября, 2011 - 09:24:54
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Имелось ввиду, что нужно объявить его абстрактным и в дочернем классе дописать все недостающее. Если класс имплементит интерфейс - никакими уловками ты не заставишь его работать, не реализовав в этом классе все, что требует интерфейс.
 
My status
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB