Ковариантность и контравариантность (программирование): различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
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>, а не наоборот. Действительно, если «все строки — объекты», то «всякий метод, оперирующий произвольными объектами, может выполнить операцию над строкой», но не наоборот
Отсутствие наследования между производными типами называется '''инвариантностью'''.
|