Ответ
Ковариантность — это возможность использовать более конкретный тип (подтип) вместо более общего (родительского) в определённых контекстах. В объектно-ориентированном программировании это часто относится к возвращаемым типам методов.
Пример в 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 на данный момент поддерживается только ковариантность возвращаемых типов и контравариантность типов аргументов.
На практике это позволяет писать более выразительный и строгий код, когда специализированные классы точно указывают, с каким конкретным типом они работают.