Вопрос проверяет знание абстрактных классов и понимание, как задавать общий контракт и базовую логику для группы классов.
Абстрактный класс — это класс, от которого нельзя создать объект напрямую. Он задаёт общую структуру и обязательные методы для потомков. Дочерние классы обязаны реализовать абстрактные методы. Это помогает стандартизировать поведение и избежать дублирования кода.
Абстрактные классы используются, когда у нескольких классов есть общая логика и общий смысл, но конкретная реализация отличается.
Определение:
Абстрактный класс — это класс, который может содержать абстрактные методы (без реализации) и обычные методы, и не может быть создан напрямую.
Animalabstract class Animal {
protected string $name;
public function __construct(string $name) {
$this->name = $name;
}
abstract public function makeSound(): string;
public function getName(): string {
return $this->name;
}
}
Здесь:
makeSound() — обязателен для реализации
getName() — общая логика для всех животных
class Dog extends Animal {
public function makeSound(): string {
return 'Woof';
}
}
class Cat extends Animal {
public function makeSound(): string {
return 'Meow';
}
}
$animals = [
new Dog('Buddy'),
new Cat('Murka'),
];
foreach ($animals as $animal) {
echo $animal->getName() . ': ' . $animal->makeSound();
}
Общий контракт поведения
Частичная реализация “по умолчанию”
Полиморфизм без дублирования кода
Абстрактный класс нужен, когда есть общее поведение и обязательные методы. Он хорошо подходит для базовых сущностей доменной модели.