Наследование от класса и реализация интерфейса
Класс может наследовать от другого класса и при этом реализовывать какой-то интерфейс. Рассмотрим на практическом примере.
Пусть мы хотим сделать класс Programmer
,
у которого будет имя, зарплата и список языков,
которые знает программист.
Пока наше описание класса весьма расплывчато: да, в классе будет имя, зарплата, языки - но какие методы будут в нашем классе?
Давайте более точно опишем наш класс с помощью
интерфейса iProgrammer
:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Пусть мы покопались в уже реализованных нами
классах и, оказывается, у нас уже есть похожий
класс Employee
. Он реализует не все
методы класса Programmer
, но часть.
Вот код уже существующего у нас класса:
<?php
class Employee
{
private $name;
private $salary;
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
public function getName()
{
return $this->name;
}
public function getSalary()
{
return $this->salary;
}
}
?>
Логично в нашем случае сделать так, чтобы
наш новый класс Programmer
унаследовал
часть необходимых себе методов от класса
Employee
(а часть мы потом реализуем
уже в самом новом классе):
<?php
class Programmer extends Employee
{
}
?>
При этом нам известно, что класс Pogrammer
должен реализовывать интерфейс iProgrammer
:
<?php
class Programmer implements iProgrammer
{
}
?>
Давайте совместим наследование от класса
Employee
и реализацию интерфейса iProgrammer
:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Получится, что наш класс Pogrammer
унаследует от класса Employee
методы
__construct
, getName
и getSalary
,
а методы addLang
и getLangs
нам придется реализовать:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// реализация
}
public function getLangs()
{
// реализация
}
}
?>
Интерфейсу iProgrammer
все равно,
родные методы у класса или унаследованные
- главное, чтобы все описанные методы были
реализованы.
Скопируйте код моего класса Employee
и код интерфейса iProgrammer
. Не копируйте
мою заготовку класса Programmer
-
не подсматривая в мой код реализуйте этот
класс самостоятельно.