OOP: переопределение
Glossary overview

OOP: переопределение

Переопределение в ООП – это механизм, при котором дочерний класс заменяет реализацию метода родительского класса, сохраняя ту же сигнатуру метода.

Ключевая идея: поведение можно изменить в наследнике, не меняя контракт.

Формально:

Переопределение (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

Что важно.

  1. Имя метода должно совпадать.
  2. Видимость нельзя уменьшать.
    • если в родителе public, в потомке нельзя сделать protected.
  3. Сигнатура должна быть совместимой.
    • параметры и возвращаемые типы должны соответствовать правилам совместимости типов.
  4. Ещё тонкость – private методы не переопределяются. Если в родителе метод private, в потомке ты создаёшь новый метод с тем же именем, но это не override. Это отдельный метод.

final

Если в родителе метод объявлен final, переопределение запрещено:

class Animal {
    final public function speak() {}
}

class Dog extends Animal {
    public function speak() {} // ошибка
}

Переопределение нужно, когда:

  • Родитель задаёт общий интерфейс поведения
  • Дочерние классы реализуют конкретные варианты

Это основа шаблонов:

  • Template Method
  • Strategy
  • Factory
  • Active Record