Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/68: Рейтинг темы: голосов - 68, средняя оценка - 4.93
29 / 31 / 2
Регистрация: 14.04.2012
Сообщений: 152

Ковариантность и Контрвариантность - что это?

08.09.2012, 15:12. Показов 13439. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь мне объяснить эти два понятия, ещё читая Шилдта не понял, что эта за возможность такая, а теперь столкнулся c подобными темами в другой книге, например:

Ковариантность обобщенных интерфейсов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public interface IIndex<out T> 
{ 
Т this[int index] { get; } 
int Count { get; } , 
} 
public class RectangleCollection: IIndex<Rectangle> 
{ 
private Rectangle[] data = new Rectangle[3] 
{ 
new Rectangle { Height=2, Width=5}, 
new Rectangle { Height=3, Width=7}, 
new Rectangle { Height=4.5, Width=2.9} 
}; 
public static RectangleCollection GetRectangles () 
{ 
return new RectangleCollection (); 
} 
public Rectangle this[int index] 
{
get 
{ 
if (index < 0 || index > data.Length) 
throw new ArgumentOutOfRangeException("index") ; 
return data[index]; 
} 
} 
public int Count 
{ 
get 
{ 
return data.Length; 
} 
}
}
static void Main() 
{ 
IIndex<Rectangle> rectangles = RectangleCollection.GetRectangles(); 
IIndex<Shape> shapes = rectangles; 
for (int i = 0; i < shapes.Count; i++) 
{ 
Console.WriteLine(shapes[i]); 
}}
И в чем здесь заключается ковариантность интерфейса?
А уж к контрвариантности обобщенных интерфейсов я и переходить боюсь, застрял на этом теме уже дней 5.Может, вся проблема в том, что я не очень понимаю суть этих 2 магических понятий.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2012, 15:12
Ответы с готовыми решениями:

Ковариантность и контрвариантность
Обьясните по простому, на сколько это возможно, что такое Ковариантность и контрвариантность. Где это применяется и нужно ли заостоять...

Ковариантность и контрвариантность
Добрый день, в книге дошел до ковариантности и контравариантности и появился вопрос. Если с ковариантностью все понятно, потому что если...

Ковариантность (и контрвариантность) массивов
Найдите и исправьте ошибки в методе Main using System; namespace Less05_task01 { class Program { static void Main(...

10
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.09.2012, 16:02
Лучший ответ Сообщение было отмечено как решение

Решение

О да, на этой теме много у кого крышу сносит

Ковариантность:
Если есть некий класс Б, унаследованный от класса А, то обобщенный интерфейс Х<T> называется ковариантным в том случае, если экземпляр интерфейса Х<Б> можно привести к типу X<A>.
Чтобы обобщенный интерфейс сделать ковариантным, нужно параметру типа приписать оператор out - это гарантирует, что экземпляр указанного типа в любом методе интерфейса может быть только выходным параметром, но никак не входным:
C#
1
2
3
4
5
interface ICovariant<out T>
{
   T GetSomething(); // OK
   void SetSomething(T value); // Ошибка компиляции - обобщенный тип T может служить только выходным параметром.
}
Контрвариантность - это наоборот:
Если имеется некий класс Б, унаследованный от класса А, то обобщенный интерфейс X<T> называется контрвариантным в том случае, если экземпляр интерфейса X<A> можно привести к типу X<Б>.
Обеспечивается это параметром in перед обобщенным типом и гарантирует, что экземпляры этого типа в любом из методов интерфейса могут служить лишь входными параметрами, но никак не выходными:
C#
1
2
3
4
5
interface IContravariant<in T>
{
   T GetSomething(); // Ошибка компиляции - обобщенный тип Т может служить только входным параметром
   void SetSomething(T value); // OK
}
Зачем это нужно: для сохранения строгой типизации обобщенных объектов при полиморфизме.
16
29 / 31 / 2
Регистрация: 14.04.2012
Сообщений: 152
08.09.2012, 16:08  [ТС]
Спасибо большое, прям таки обрадовался, как увидел ваш ник снизу.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.09.2012, 16:10
Лучший ответ Сообщение было отмечено как решение

Решение

На вашем примере с фигурами.
Предположим, что ковариантность соблюдается без всяких дополнительных условий, то есть интерфейс может иметь такой вид (обратите внимание на добавленный set):
C#
1
2
3
4
5
public interface IIndex<T> 
{ 
   Т this[int index] { get; set;} 
   int Count { get; } , 
}
И всегда можно написать так:
C#
1
2
IIndex<Rectangle> rectangles = RectangleCollection.GetRectangles(); 
IIndex<Shape> shapes = rectangles;
В этом случае будет возможна такая рокировка:
C#
1
shapes.Add(new Circle());
Оп-па! Получается, что в экземпляре объекта RectangleCollection вкрался кружок - то есть нарушилась строгая типизация.
До четвертого фреймворка такие пляски бы не вышли, потому что для сохранения этой строгой типизации компилятор запрещает подобное приведение типов.
С появлением вариативности мы параметром out заверяем компилятор: не парься, родной, если кто-то попытается привести этот интерфейс к родительскому - они могут только доставать элементы (которые можно без проблем привести к родительским), но не могут их туда пихать, потому все пучком, никто не сможет круг засунуть в коллекцию прямоугольников - инфа 100%.

Ну а контрвариантность - строго наоборот: можно пихать экземпляры дочерних классов в интерфейс базового класса, т.к. любой дочерний класс без проблем можно привести к базовому:
C#
1
2
IIndex<Circle> shapes = new ShapeCollection();
shapes.Add(new Circle()); // Но проблемо - у нас хранятся любые фигуры, без ограничений
P.S. Че-то долго пример писал - уже ответили.
Ну, может кому пригодится.
10
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
08.09.2012, 16:14
Можно добавить, что работают сии чудеса только в шарпе 3.0 и выше.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.09.2012, 16:17
Цитата Сообщение от freeba Посмотреть сообщение
работают сии чудеса только в шарпе 3.0 и выше.
Начиная с 4.0.
1
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
08.09.2012, 16:19
Ммм, с 3.0 CLR не обновлялась, запустить код fw4 можно и на fw3 Таким же образом как и порт fw3.5 под fw2
В 2008 студии создаешь консольное приложение, в референсах оставляешь только System.Core (ей надо проставить «Copy Local»), используешь LINQ, собираешь, копируешь на тазик, где установлен только .NET 2.0 и пробуешь запустить.

В простейшем случае достаточно.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.09.2012, 16:34
Цитата Сообщение от freeba Посмотреть сообщение
с 3.0 CLR не обновлялась, запустить код fw4 можно и на fw3
Если у вас есть система с 3.0 или 3.5, то попробуйте написать на четверке простое приложение, где используется вариантность и запустить его на ней.
Почему-то у меня стойкое ощущение, что вывалится InvalidCastException.
2
4 / 4 / 1
Регистрация: 20.01.2010
Сообщений: 93
31.12.2013, 21:13
Цитата Сообщение от kolorotur Посмотреть сообщение
Ковариантность:
Если есть некий класс Б, унаследованный от класса А, то обобщенный интерфейс Х<T> называется ковариантным в том случае, если экземпляр интерфейса Х<Б> можно привести к типу X<A>.
если можно, пару слов, о том, как на практике это используется? т.е.
1. зачем получать ссылки интерфейсов на реализующие их классы?
2. зачем получать ссылки интерфейсов на реализующие их классы, используя при этом ко\контрвариантность?

P.s. вижу, что тема старая, но для меня сейчас очень актуальная
0
0 / 0 / 0
Регистрация: 12.09.2016
Сообщений: 1
26.11.2016, 13:40
Цитата Сообщение от sergIKO Посмотреть сообщение
если можно, пару слов, о том, как на практике это используется? т.е.
1. зачем получать ссылки интерфейсов на реализующие их классы?
2. зачем получать ссылки интерфейсов на реализующие их классы, используя при этом ко\контрвариантность?

P.s. вижу, что тема старая, но для меня сейчас очень актуальная
Блин АНАЛОГИЧНО
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.11.2016, 15:33
Цитата Сообщение от BeeHoney Посмотреть сообщение
АНАЛОГИЧНО
Вопрос, как мне кажется, немного неправильно поставлен.
Ссылки на интерфейсы не нужно получать, но зачастую их приходится использовать — когда либо вам из какой-то сторонней системы приходит только ссылка на интерфейс, либо какая-то сторонняя система (класс), который вы хотите использовать, принимает только ссылку на интерфейс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2016, 15:33
Помогаю со студенческими работами здесь

Что такое ковариантность и контрковариантность?
Может кто-нибудь объяснить коротко своими словами что такое ковариантность и контрковариантность? Добавлено через 1 минуту И как эти...

Что это за знак >> прочитал что это сдвиг вправо? что он делает
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

mc68hc908 - это что это, это с чем это ??
Здравствуйте люди местные. Сам я мучаю АВР-ки, но для других я &quot;типа&quot; гуру, и вот пришли ко мне и спросили - а что есть сабж, и как его...

Не могу понять, что это за реализация ORM и как это работает
Есть проект на C#, есть база данных MSSQL, есть код, который позволяет мне добавлять и удалять данные из базы данных (без создания и...

При загрузке компа появляется это, не знаете что это и как исправить
при загрузке компа появляется это, не знаете что это и как исправить


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru