Ковариантность и контравариантность (программирование): различия между версиями

[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м Пример для контрвариантности
отмена правки 82218241 участника Chai0103 (обс)
Строка 5:
'''Ковариантностью''' называется сохранение иерархии наследования исходных типов в производных типах в том же порядке. Так, если класс <code>Cat</code> наследует от класса <code>Animal</code>, то естественно полагать, что перечисление <code>IEnumerable<Cat></code> будет потомком перечисления <code>IEnumerable<Animal></code>. Действительно, «список из пяти кошек» — это частный случай «списка из пяти животных». В таком случае говорят, что тип (в данном случае обобщённый интерфейс) <code>IEnumerable<T></code> ''ковариантен'' своему параметру-типу T.
 
'''Контравариантностью''' называется обращение иерархии исходных типов на противоположную в производных типах. Так, если класс <code>String</code> наследует от класса <code>Object</code>, а делегат <code>Action<T></code> определён как метод, принимающий объект типа T, то <code>Action<Object></code> наследует от делегата <code>Action<String></code>, а не наоборот. Действительно, если «все строки — объекты», то «всякий метод, оперирующий произвольными объектами, может выполнить операцию над строкой», но не наоборот. Например, если можно нажать клавишу на клавиатуре, то это не значит, что и на устройстве можно нажать её (оно может не иметь понятия о том, что такое клавиша). В таком случае говорят, что тип (в данном случае обобщённый делегат) <code>Action<T></code> ''контравариантен'' своему параметру-типу T.
 
Отсутствие наследования между производными типами называется '''инвариантностью'''.