для чего нужны абстрактные классы и интерфейсы ?

AllReady

Новичок
Деструктору вообще до лампады что тебе надо сделать, он просто вызывается по завершении работы. Этим и надо пользоваться =)
Понял, спасибо. А можешь объяснить пожалуйста, для чего вообще нужны абстрактные классы и интерфейсы ? Вот ты создаешь тупо интерфейс (или абстрактный класс) с методами. Затем у наследника их перераспределяешь. Зачем это все нужно ? Ну или где примерно такое применяется ?
 

hell0w0rd

Продвинутый новичок
AllReady, самый простой пример - с реальными интерфейсами. Вот у тебя есть задача - напечатать страницу, принтеров тьма, пишешь интерфейс PrinterInterface, и дальше можешь подключать любой принтер, драйвер которого этот интерфейс реализует.
 

AllReady

Новичок
AllReady, самый простой пример - с реальными интерфейсами. Вот у тебя есть задача - напечатать страницу, принтеров тьма, пишешь интерфейс PrinterInterface, и дальше можешь подключать любой принтер, драйвер которого этот интерфейс реализует.
Ну ты же вроде объявляешь метод в интерфейсе например:
function HP() {тут команда для метода}
но тебе же в любом случае нужно его переопределить ? Какой смысл вообще создавать ее, если нужно все перезаписывать ?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AllReady, какая команда для метода? там не может быть реализации метода в интерфейсе =)
 

AllReady

Новичок
AllReady, какая команда для метода? там не может быть реализации метода в интерфейсе =)
Цитирую с руселлера:
"Определение методов класса
Метод — это функция класса. Индивидуальное действие, которое может выполнить объект, определяется в классе как метод."
По сути интерфейсы ведь абстрактные классы.
Или же вот когда говорят о интерфейсах в отдельности:
Давайте переместим абстрактный метод say из класса Animal в интерфейс.
interface СanSay {
public function say();
}
Вот зачем я имею ввиду писать интерфейс ляляля { function лялял() } если при имплементации в класс, нужно его (метод с интерфейса) все равно перераспределять
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AllReady, ты не понимаешь что есть имплементация, а есть переопределение. В этом и проблема. В случае с интерфейсом - ты должен все его методы имплементировать, чтобы достичь общности. Единого API, если так можно выразиться, в работе приложения, реализующего интерфейс.

По сути интерфейсы ведь абстрактные классы.
Нет

все равно перераспределять
Перераспределять?)
 

AllReady

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


Нет


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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AllReady, в данном случае нет понятия такого, перераспределять. Да, в интерфейсах описывают "архитектуру" будущих классов. Описывают для того, чтобы ты не наворотил ненужного кода. Если тебе надо реализовать слой кеширования, не важно на чем, файлы, мемкеш, или что еще - ты пишешь общий интерфейс (а иногда и не один), в котором опишешь методы, которые будут у твоих адаптеров кеширования общими, и эти методы будут говорить всем как работать с объектом, их реализующим. get() - достает данные, set() - записывает. И везде у тебя будет все называться одинаково, всегда.

На момент создание какого либо метода, нам нужно идти в интерфейс и смотреть что я там описывал ?
зачем? тебе ошибка вылетит, если ты какой метод интерфейса не реализовал в классе.
 

WMix

герр M:)ller
Партнер клуба
AllReady, хочется заранее знать о существовании того или иного метода обьекта, не потому что мы видели что он в классе прописан, а потому что он (обьект) является типом того или иного интерфейса.
 

Lionishy

Новичок
AllReady, открываешь Гради Буч (Booch Grady) "Объектно ориентированный анализ и проектирование с примерами" (Object-Oriented Analysis and Design with Applications), там всё написано. В том числе: "интерфейс -- аспект класса/реализации".

Бертран Мейер (Bertrand Meyer) "Создание объектно-ориентированного ПО" (Object-Oriented Software Construction). Здесь хорошо описан подход "интерфейс -- контракт", "реализация -- поставщик", "исключения -- нарушения контракта". Весьма полезно.

Дальше, наверняка, сможешь прочитать более современные и запутанные.

Вот после этого можешь возвращаться на форум. А в трёх словах, между делом под кофе и бутерброд никто не выдаст тебе в достаточном объёме анализ ООП болота, утонешь.
 
Последнее редактирование:

AllReady

Новичок
Мне кажется это бредово, когда пишешь класс, то ты должен знать для чего ты его пишешь и знаешь какие методы для него делать. Не лучше комментарии тогда использовать? Можете показать скрипты, где их используют например?
P.S. Всем спасибо за ответы
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AllReady, скриптов много в интернетах, берешь любой фреймворк и изучаешь.
 

Фанат

oncle terrible
Команда форума
Не смог понять, каким образом этот вопрос всплыл в процессе обсуждения предыдущего.
 

hell0w0rd

Продвинутый новичок
AllReady, все дело в том, что в мире куча однотипных вещей. Я уже привел пример с принтерами. В мире веб-программирования это базы данных, очереди, пользователи, валидаторы, формы и тому подобные вещи. Тебе правильно сказали - посмотри реальные примеры
Вот тебе пример:
https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Config/Loader/LoaderInterface.php
https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Config/Loader/FileLoader.php
 

Вурдалак

Продвинутый новичок
Видимо чувак не понимает что с этим интерфейсом делать. Типа делает new FileLoader(). «И чё?»
 
Сверху