Переопределение в ООП – это механизм, при котором дочерний класс заменяет реализацию метода родительского класса, сохраняя ту же сигнатуру метода.
Ключевая идея: поведение можно изменить в наследнике, не меняя контракт.
Формально:
Переопределение (method overriding) – это объявление в дочернем классе метода с тем же именем и совместимой сигнатурой, что и у родителя, с целью изменить его реализацию.
Теперь пример.
class Animal {
public function speak(): string {
return "Some sound";
}
}
class Dog extends Animal {
public function speak(): string {
return "Woof";
}
}
$dog = new Dog();
echo $dog->speak(); // Woof
Что важно.
- Имя метода должно совпадать.
- Видимость нельзя уменьшать.
- если в родителе public, в потомке нельзя сделать protected.
- Сигнатура должна быть совместимой.
- параметры и возвращаемые типы должны соответствовать правилам совместимости типов.
- Ещё тонкость – private методы не переопределяются. Если в родителе метод private, в потомке ты создаёшь новый метод с тем же именем, но это не override. Это отдельный метод.
final
Если в родителе метод объявлен final, переопределение запрещено:
class Animal {
final public function speak() {}
}
class Dog extends Animal {
public function speak() {} // ошибка
}
Переопределение нужно, когда:
- Родитель задаёт общий интерфейс поведения
- Дочерние классы реализуют конкретные варианты
Это основа шаблонов:
- Template Method
- Strategy
- Factory
- Active Record