Бортовой журнал Ктулху

Что из себя представляют абстрактные классы и интерфейсы на примере птиц

Простое и понятное объяснение как использовать абстрактные классы и интерфейсы, в чем их отличие.

Абстрактные классы помогают создавать иерархию с общими чертами. Важным тут является именно связь родитель — наследник. Например абстрактный класс «птица», ее наследники — конкретные виды птиц.

images 

abstract class bird {
public abstract function scream();
public abstract function run();
public abstract function fly();
}
// сова
class owl extends bird {
 public function scream()
 {
  return 'uhh-uhh';
 }
 public function run()
 {
  return 'shkryab-shkryab';
 }
 public function fly()
 {
  return 'silently';
 }
}

При использовании нам не важно, какая именно птица будет — мы используем ссылку с типом абстрактного класса. И используем методы «кричать», «ходить», «летать».

Все ок, но что если не все птицы умеют летать? Например страус, пингвин.

abstract class bird {
 public abstract function scream();
 public abstract function run();
}
// пингвин. Нет метода реализации полета
class penguin extends bird
{
 public function scream()
 {
  return 'kar-kar';
 }
 public function run()
 {
  return 'shlep-shlep';
 }
}

Здесь нам могут помочь интерфейсы, которым не важна связь родитель — наследник, они задают правила поведения. Мы можем выделить метод «летать» в интерфейс и реализовать его у тех птиц, которые могут летать; при этом каждая птица может летать характерным только для нее способом. Так же мы сможем в будущем реализовать этот интерфейс у самолета и определить его способ полета.

interface fly {
 public function fly();
}
abstract class bird {
 public abstract function scream();
 public abstract function run();
}
// класс "сова" реализует полет при помощи интерфейса fly
class owl extends bird implements fly {
 public function scream()
 {
 return 'uhh-uhh';
 }
 public function run()
 {
 return 'shkryab-shkryab';
 }
 public function fly()
 {
 return 'silently';
 }
}

Например, у нас на острове группа зверей, птиц, машин и нам надо переправить их на другой остров. В этом случае это сделают те, кто реализует интерфейс с методом «летать».

И здесь мы получаем две ветви полиморфизма, одна задает связь родитель —наследник, вторая — поведение.

Утянуто отсюда.