Абстрактные классы и интерфейсы

Gee

Новичок
Объясните, пожалуйста, зачем нужны абстрактные классы и интерфейсы? Я прочитал книгу по ООП, так же общался с google на эту тему, но это не дало мне ответа. Если быть точнее, то мне не понятно их предназначние. То есть если я хочу написать класс, пусть это будет класс новостей, я пишу все необходимые методы и так далее, все работает и все рады. Но зачем мне нужен абстрактный класс или интерфейс в данном случае? Хочу понять смыл этого.
 

Ragazzo

TDD interested
Смысл станет понятен потом, когда будет чуть больше опыта. Основной смысл в том чтобы проектировать не "классами", а "интерфейсами" т.к. именно интерфейс дает базовую сигнатуру методов, поэтому зная какой объект реализует тот или иной интерфейс мы с ним спокойно и работаем. Абстрактный класс это не то же самое что интерфейс, да (класс может иметь несколько интерфейсов в себе).
P.S. это я совсем упрощенно объяснил конечно.
 

WMix

герр M:)ller
Партнер клуба
глупый пример.
PHP:
 function xyz(  $figure ){
...
  echo $figure->area();
...
 }
xyz( new Circle(5) );
xyz( new Square(3) );
как быть уверенным что $figure имеет метод area() ?
 

Ragazzo

TDD interested
WMix
с помощью тайпхинта или instanceof и прочего. Что-то ты совсем уже "дельными" советами скоро всех замучаешь.
 

Gee

Новичок
Смысл станет понятен потом, когда будет чуть больше опыта. Основной смысл в том чтобы проектировать не "классами", а "интерфейсами" т.к. именно интерфейс дает базовую сигнатуру методов, поэтому зная какой объект реализует тот или иной интерфейс мы с ним спокойно и работаем. Абстрактный класс это не то же самое что интерфейс, да (класс может иметь несколько интерфейсов в себе).
P.S. это я совсем упрощенно объяснил конечно.
Спасибо за ответ.
Возможно понятно станет потом, но ведь пишу программы сейчас, а хочется делать это хорошо, правильно...

глупый пример.
PHP:
 function xyz(  $figure ){
...
  echo $figure->area();
...
 }
xyz( new Circle(5) );
xyz( new Square(3) );
как быть уверенным что $figure имеет метод area() ?
Посмотреть документацию к классу :) А на самом деле, я же не буду вызывать метод, если не знаю есть ли он вообще или нет...
 

WMix

герр M:)ller
Партнер клуба
Gee
а ты и не писал ни Circle ни Square ты написал только xyz() и хочешь гарантировать что он работает правильно и любой разработчик может пользоваться твоим методом подставляя обьекты Circle и Square и другие самонаписанные!
 

radioheaded

PHP нуб
WMix
с помощью тайпхинта или instanceof и прочего. Что-то ты совсем уже "дельными" советами скоро всех замучаешь.
WMix привел как раз дельный пример, а вы полную фигню написали, и сами этого не поняли.

Посмотреть документацию к классу А на самом деле, я же не буду вызывать метод, если не знаю есть ли он вообще или нет...
А ты представь, что разрабатываешь часть кода, которая использует метод вычисления площади фигуры, но ты не знаешь, какие фигуры тебе в этот метод будут подсовывать. Сравни два кода
function xyz($figure) {...}
и
function xyz(Figure $figure ) {...}
В первом случае ты вообще ничего не знаешь о параметре. Во втором у тебя есть интерфейс, который может быть еще не реализован, но уже дает тебе сведения о том, как использовать параметр. Figure может быть интерфейсом или абстрактным классом или просто классом. Circle и Square могут реализовывать интерфейс Figure или быть унаследованными от абстрактного класса Figure.

Но вообще, можно пытаться объяснять до бесконечности. Ты действительно начнешь чувствовать это только тогда, когда попадешь в реальную ситуацию, требующую хорошего применения ООП. Это очень полезно и местами даже необходимо при работе над крупными проектами в большой команде, не нужно пытаться городить страшную иерархию там, где она совсем не нужна.
 

WMix

герр M:)ller
Партнер клуба
Gee
полный пример
PHP:
interface Figure{
   public function area();
}

function xyz( Figure $figure ){
...
  echo $figure->area();
...
}
теперь можно гарантировать...

сторонний разаработчик может запихать в твой метод xyz() только обьекты типа Figure.

PHP:
class  Circle implements Figure{
...
}
но чтоб это работало разработчик должен имплементировать интерфейс Figure а значит описать метод area
PHP:
class  Circle implements Figure{
 ...
 public function area(){ return 3.14*$this->r*$this->r; }
}
PHP:
xyz( new Circle(5) );
 

Adelf

Administrator
Команда форума
Ragazzo
не занудствуй. он привел правильный пример. че еще надо то новичку?
 

WMix

герр M:)ller
Партнер клуба
Ragazzo
типизация это только половина.... Gee спрашивал зачем нужен interface
я понял что ты продвинутый парень, не нужно слюной брызгать!
 

Baton

Новичок
Gee
Если последуете моему совету и купите вот эту книгу http://www.books.ru/books/patterny-proektirovaniya-850800/?show=1 то получите ответы на свои вопросы. Да, книга для Java, но написана очень легко. Java ООП очень похож на PHP ООП.

Кроме того книга есть в интернете бесплатно, можете изучить перед покупкой, а также я находил примеры из книги переписанные на php и сам лично их изучал. Было бы желание.
 

Redjik

Джедай-мастер
Baton
Поддерживаю, я даже купил ее... самое то перед бандой 4х прочитать...
 

WMix

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

AmdY

Пью пиво
Команда форума
Вам не смешно советовать целу книгу человеку, который даже одну главу по ООП разобрать не может. Ему надо писать СЕЙЧАС. :(
 

Redjik

Джедай-мастер
AmdY
Такую - нет =)
Прочитай первые 30 страниц, там подача материала очень хорошая.

Не скажу, что много нового для себя в ней нашел, но все же на некоторые вещи я взглянул по-другому.
 
Сверху