Ковариантность и контравариантность (программирование): различия между версиями
[отпатрулированная версия] | [непроверенная версия] |
Содержимое удалено Содержимое добавлено
Lertmind (обсуждение | вклад) →C#: Убрано лишнее определение класса Cat, добавлене метод GetAnyObject для соответствия |
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.
Отсутствие наследования между производными типами называется '''инвариантностью'''.
|