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 :: Интерфейсы и абстрактные классы
Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010 Откуда: Minsk
Помог: 3 раз(а)
Ходил на несколько собеседований, везде задавали вопрос, чем отличается абстрактный класс от интерфейса. К сожалению, не мог ответить. На одну работу все таки взяли. Почитал про эти классы. Вроде понял. Но есть некоторые вопросы, на которые не нашел ответов:
1) Для чего на практике используются интерфейсы и абстрактные классы? Ведь если делаем implement интерфейса, нужно определять все методы, описанные в этом интерфейсе.
2) Когда нужно использовать абстрактный класс, а когда интерфейс?
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
Тоже задавался этим вопросом когда-то. Донимал народ в ирке - расспрашивал по этому поводу. Внятного ответа так и не получил, зато узнал что некоторые используют интерфейс в качестве флагов
Вообще у меня существует предположение, что интерфейсы являются гарантом реализации определенного API в архитектуре. Но по сути это можно реализовать теми же абстрактными классами, так что необходимость в интерфейсах для меня тоже пока остается загадкой.
Покинул форум
Сообщений всего: 260
Дата рег-ции: Май 2010
Помог: 0 раз(а)
интерфейс определяет функциональность, но не реализует ее
нельзя создать экземпляр абстрактного класса, но в нем может определиться и частично реализоваться интерфейс для любого класса
----- Хостинг - неограниченно доменов на одну папку Ajax - отличное введение
Champion
Отправлено: 22 Августа, 2010 - 13:45:51
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Абстрактным класс будет уже если в нём хотя бы один абстрактный метод. При этом в нём могут быть и реализованные методы и разные свойства.
В интерфейсе нет свойств, а все методы абстрактные. Кроме этого implements можно сделать от нескольких интерфейсов. А наследовать (extends) только от одного класса.
Вот этим они отличаются и отсюда вроде вылазит ответ на второй вопрос.
garvey пишет:
Ведь если делаем implement интерфейса, нужно определять все методы, описанные в этом интерфейсе.
Но если не сделать implement интерфейса, то ты будешь обязан написать реализацию методов. Можно сначала спроектировать функционал интерфейса, а когда дело дойдет до реализации, нужно будет реализовать уже спректированный набор методов.... Не, че-то не четко я написал. Ща кто-нибудь получше скажет про это.
movEAX
Отправлено: 22 Августа, 2010 - 14:38:18
Частый посетитель
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
Champion пишет:
Ща кто-нибудь получше скажет про это.
JustUserR точно должен об этом что-нибудь рассказать, ждем-с.
Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010 Откуда: Minsk
Помог: 3 раз(а)
Только что изучал движок Zend Framework, так как знал, что там есть и интерфейсы и абстрактные классы. Да, интерфейсы отображают только структуру(общее API, скорее всего предназначен для нормализации проекта). Но вот нашел абстрактный класс, в котором не было ни одного абстрактного метода. И к чему, спрашиваеься, он абстрактный? Можно было и простой написать.
Покинул форум
Сообщений всего: 260
Дата рег-ции: Май 2010
Помог: 0 раз(а)
garvey, во многом это задает стиль программирования
абстрактные классы - принуждают создавать процедуры в классах
интерфейс - функциональность
----- Хостинг - неограниченно доменов на одну папку Ajax - отличное введение
JustUserR
Отправлено: 23 Августа, 2010 - 15:03:27
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
movEAX пишет:
JustUserR точно должен об этом что-нибудь рассказать, ждем-с.
Использование абстрактных классов и интерфейсов является вопросом технологии программирования и в частности ООП-методик - дело в том в принципе на практике возможно использовать все эти объекты исключительно с семантическо-синтаксической точки зрения без реализации их истинной цели - как правило это происходит в небольших программах и проектах где вопрос об архитектуре не стоит - но зато применяется множество различных библиотек и участников кода взятых из сторонних источников для реализации некоторых задач - и если в оригинале использовать тех или иных шаблонов программирования было оправдано то в копии оно может быть и лишено первоначального предназначения В динамических языках программирования типа PHP все парадигмы очень простой обойти - в частности за счет возможности runtime-модификации все функций и классов и текущего исполняемого кода - и если что-то с точки зрения исходной парадигмы было запрещено по архитектурным соображениям то это легко разрешить здесь - мощным средством в PHP для этого является расширение runkit а в Perl это уже и так встроено в язык
Таким образом если рассматривать понятия абстрактных классов и интерфейсов в идеализированном виде на без приложения к определенному языку программирования - то разницу можно определить примерно так В случае использования интерфейса конкретные реализации методов и значений свойств могут определяться только в порожденным им обычных классах без элементов меньшего порядка абстракции - в то время как абстрактный класс может содержать некоторые реализации методов и значения свойств по умолчанию "Интерфейс определяет границу взаимодействия между классами или компонентами, специфицируя определенную абстракцию, которую осуществляет реализующая сторона" - в то время как абстрактный класс является по сути шаблоном для наследуемых от него классов с указанием основных содержащих элементов и их взаимодействием
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
EuGen
Отправлено: 23 Августа, 2010 - 15:20:17
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Есть такие вещи - общепринятые и уже являющиеся стандартными - как design patterns, uml , {...} (шаблоны проектирования, язык описания структур и прочее)
К таким же стандартам стоит отнести и приемы проектирования/программирования с использованием ООП.
Интерфейс, в частности, реализует один из постулатов ООП - а именно инкапсуляцию - когда реализация скрыта от пользователя.
Как пример можно привести паттерн проектирования Adapter (Адаптер) - и пример реализации этого паттерна для БД - когда мы имеем только API для обращения к БД, абстрагируясь от самой СУБД - нам не важно что там физически - MySQL или Oracle или что-либо другое - у нас есть только набор предоставляемых интерфейсом методов для работы с БД, не более. И этого будет вполне достаточно.
Сказать кратко здесь сложно, но, надеюсь, идея понятна.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
garvey
Отправлено: 23 Августа, 2010 - 15:41:36
Частый посетитель
Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010 Откуда: Minsk
Помог: 3 раз(а)
JustUserR,EuGen, большое спасибо. Понял. Правильно, рассуждаете.
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.