Что такое ковариантность в ООП?

«Что такое ковариантность в ООП?» — вопрос из категории ООП, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ковариантность — это возможность использовать более конкретный тип (подтип) вместо более общего (родительского) в определённых контекстах. В объектно-ориентированном программировании это часто относится к возвращаемым типам методов.

Пример в PHP (начиная с версии 7.4):

class Animal {}
class Dog extends Animal {}

interface AnimalShelter {
    public function adopt(): Animal;
}

class DogShelter implements AnimalShelter {
    // Возвращаем Dog, который является подтипом Animal — это ковариантность.
    public function adopt(): Dog {
        return new Dog();
    }
}

Ключевые аспекты:

  • Направление: Работает с возвращаемыми значениями методов. Дочерний класс может сужать (уточнять) тип возвращаемого значения по сравнению с родительским методом.
  • Типобезопасность: Гарантирует, что возвращаемое значение будет совместимо с ожидаемым родительским типом, повышая надёжность кода.
  • Контравариантность: Противоположное понятие — возможность использовать более общий тип для параметров метода. В PHP на данный момент поддерживается только ковариантность возвращаемых типов и контравариантность типов аргументов.

На практике это позволяет писать более выразительный и строгий код, когда специализированные классы точно указывают, с каким конкретным типом они работают.