Контравариантность | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Пока читал про делегаты, набрёл на термины Ковариантность и Контравариантность. Почитал википедию ru.wikipedia.org) .
Цитата: Продолжаю мысль: В список животных можно занести кошку, а в список кошек занести собаку нельзя. Цитата: Не понятен смысл "произвольными объектами". Это какими? Пытаюсь продолжить мысль: метод, оперирующий строками, не может выполнить операцию над ____ И, не знаю - что сюда вставить... P.S. То ли уже поздно, и просто надо лечь и поспать... |
Re: Контравариантность | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Включает в себя клон(), геттип(), тостринг() и т.д. Все эти операции реализованы со строками. не строками Это же строго типизировано) ------------------ Исправлено 1 раз(а). Последнее : Аспид, 08.03.17 10:36 |
Re: Контравариантность | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Любыми. Числами, Датами, Животными, Кошками... Числами, Датами, Животными, Кошками... В общем ничем кроме строк. Если бы тип System.String не был запечатанным (sealed), то такой метод мог бы работать и с типами-наследниками. Скажем метод работающий с "Животными" может работать и с Кошками и с Собаками, но не может работать со Строками, Числами, Датами... ------------------ WBR, Igor |
Re: Контравариантность | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Ну, как раз таки, контравариантность и позволяет смягчить строгую типизацию и использовать более универсальный (базовый) тип, чем указанный. |
Re: Контравариантность | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Точно! Надо переделать определение контравариантности на котов и животных. Подставляем вместо string - Cat, вместо object - Animal: Так, если класс Cat наследует от класса Animal, а делегат Action<T> определён как метод, принимающий объект типа T, то Action<Animal> наследует от делегата Action<Cat>, а не наоборот. Действительно, если «все коты — животные», то «всякий метод (например, сфотографировать), оперирующий произвольными животными, может выполнить операцию над котом (весь инет завален котиками)», но не наоборот. Метод, оперирующий котами (например, подержать на руках), не может выполнить операцию над любым животным (например, слоном). |
Re: Контравариантность | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
По сути правильно то описано, только меня коробит от фразы "Action<Animal> наследует от делегата Action<Cat>".
Ничего они не "наследуют". Просто при связывании делегата с методом действуют более мягкие правила - не обязательно 100% совпадение сигнатуры... Кстати, это работает и без generic-ов. Для обычных делегатов (тех же event-ов для визуальных компонент - KeyPress или KeyDown или даже Load можно "зарядить" на один и тот же метод-обработчик, хотя формально у них разные "сигнатуры") тоже применимо подобное "смягчение". ------------------ WBR, Igor |
Re: Контравариантность | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
(подумал, контрвариантный [тензор], подумал, началась голимая физика/математика )
|
Re: Контравариантность | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Мне кажется, тут под "наследует" подразумевается не наследование в терминах C#, а наследование в более общем смысле - "передача каких то прав (возможностей)", а именно - передача возможности работы с предками класса. Отсюда вытекает определение: Цитата: Хотя, на мой взгляд, определение хоть и верное, но мало что в мозгах проясняющее. IMHO, самое правильное будет: Цитата: Тут сразу понятно, для чего вся эта "пертушка".
Вот то же для меня загадка. Простой делегат (не обобщённый) он одновременно и ковариантный и контравариантный. А обобщённый по умолчанию инвариантный, но если явно указать in или out, может быть либо ковариантным либо котравариантным, одновременно быть ковариантным и контравариантным (как необобщённый) не может. Почему? Зачем? Где собака порылась? |
Re: Контравариантность | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ты не прав. Эти "вариантности" применяются к РАЗНЫМ типам: Ковариантность - к возвращаемому типу, контравариантность - к принимаемым (типам параметров).
Это так и в generic интерфейсах (т.к. там есть методы которые что-то возвращают и что-то принимают) и в делегатах (как generic так и обычных - но для обычных нельзя управлять ко- и контра-вариативностью, она работает автоматически и только для "связывания" с методами, но не для присвоения экземпляров переменным "чуть другого типа"). Естественно что и интерфейс и делегат могут одновременно быть и ко- и контра-вариантными, т.к. это аспекты применимые к разным типам. Естественно один и тот же параметр типа не может быть одновременно и ко- и контра- вариантным (это формальное ограничение, по сути, если бы оно было допустимо, то оно сделало бы этот тип ИНвариантным - т.е. можно было бы использовать только его, ни "наследники", ни "предки" не были бы допустимы). Пример одновременно ко- и контра- вариантного делегата это семейство делегатов Func<T1,T2,...TResult> Все его T* параметры контравариантны (это типы для параметров привязываемого метода), а TResult ковариантен (это тип для возвращаемого значения). ------------------ WBR, Igor |
Re: Контравариантность | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Золотые слова, Юрий Бенедиктович. (с) Наша Раша Спасибо за разъяснения. Буду курить мануалы дальше. |
© 2000-2024 Fox Club  |