# Интерфейсы и абстрактные классы
Абстрактные классы
Абстрактный класс – класс, который содержит хотя бы один абстрактный метод, то есть метод без реализации.
abstract class AbstractClass
{
/* Данный метод должен быть определён в дочернем классе */
abstract protected function getValue();
abstract protected function prefixValue($prefix);
/* Общий метод */
public function printOut() {
print $this->getValue() . "\n";
}
}
От абстрактного класса мы не можем создать объект, но можем создать неабстрактного наследника. При этом нужно «реализовать» абстрактный метод.
Из-за невозможности создать объект от абстрактного класса следует и отсутствие возможности определить конструктор в абстрактном классе.
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
Интерфейсы
Задача интерфейсов определить public-методы классов наследников(это будет крайне важно, если речь идет о полиморфизме объектов).
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
Мы можем создать от интерфейса класс, при этом говорят, что класс "реализует" интерфейс
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
Обратите внимание, что в интерфейсе мы не можем задавать свойства, что было доступно нам в абстрактных классах.
Практика:
- Interface Unit ->abstract class Warrior -> Knight, Mage