Тёмный

C#. Ковариантность и контравариантность обобщений (Интерфейсы) Урок 61 

Byte++
Подписаться 54 тыс.
Просмотров 7 тыс.
50% 1

#csharp #сишарп #уроки
Поддержите автора - www.donationalerts.ru/r/bytepp
На карту сбера 4276400076514539 (Андрей Николаевич)
Даже 100, даже 10 рублей будет просто превосходно!
Если миллион скинет по рублю будет миллион рублей!)))
В этом видео я расскажу о том, что такое ковариантность и контравариантность в C#.
Ковариантность: позволяет использовать более конкретный тип, чем заданный изначально
Контравариантность: позволяет использовать более универсальный тип, чем заданный изначально
Инвариантность: позволяет использовать только заданный тип
___
Параметры-типы могут быть:
Ковариантными. Аргумент-тип может быть преобразован от класса к одному из его базовых классов. В языке С# ковариантный тип обозначается ключевым словом out. Ковариантный параметр обобщенного типа может появляться только в выходной позиции, например, в качестве возвращаемого значения метода.
Контравариантными. Параметр-тип может быть преобразован от класса к
классу, производному от него. В языке C# контравариантный тип
обозначается ключевым словом in. Контравариантный параметр-тип
может появляться только во входной позиции, например, в качестве
аргументов метода.
Инвариантными. Параметр-тип не может изменяться.
Подписывайтесь на канал, ставьте лайки, задавайте вопросы в комментариях!

Опубликовано:

 

26 сен 2020

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 26   
@Sergei23121983
@Sergei23121983 2 года назад
Здорово. Теперь все понятно.
@ilya_dikushnikov
@ilya_dikushnikov 11 месяцев назад
Отлично, теперь всё понятно!) Спасибо🙏
@user-iz8jg2ky6p
@user-iz8jg2ky6p 2 года назад
Спасибо!
@AlexanderPavliuchik
@AlexanderPavliuchik 2 года назад
Ты просто создан объяснять!)
@june3878
@june3878 Год назад
Какую проблему решают они?
@user-py7ed1bo4w
@user-py7ed1bo4w 2 года назад
Хорошее объяснение, если кто-то не понял, то еще на метаните посмотрите.
@alexeyfranchuk3038
@alexeyfranchuk3038 2 месяца назад
Я может быть чего-то не понимаю, подскажите пожалуйста, если ошибаюсь: 1) в видео 3 примера 2) 1 пример для ввода, сказано, что в нем нет ни ковариантности ни контр-ти 3:10 3) 2 пример - показывает, что такое ковариантность (апкаст по типам), то есть у нас Garage -> IGarage от которого наследуется и его параметр, тип, передаем mercedes получаем Car 4) 3 пример - показывает, что такое контрвариантность (downCast), где, по сути все наоборот Но вот что мне не до конца понятно, если в видео говорится, что в 2м примере (upcast) выполняется в двух местах, это от производного класса к интерфейсу, от которого он наследуется и сам параметр, то что мы передаем от mercedes -> Car, то в первом примере есть тоже по сути upcast - это 32 строка (из Garage -> в IGarage), но просто с таким же типом параметра, то есть выполняется upcast класса же ?. Вот с этим я что-то совсем запутался.
@LilPozzer
@LilPozzer 2 года назад
разве они отсекаются? они же просто прайват становятся и это тип инкапсуляция
@user-zd3qw7le5c
@user-zd3qw7le5c 11 месяцев назад
наверное в конструкторе должно быть не поле а свойство - вот так CarPlace = car;
@russianhotell
@russianhotell Год назад
Ковариантность и контрвариантность относится к интерфейсам и делегатам, так же одна только ковариантность присуща массивам ссылочных типов
@user-zw4dh5gn6b
@user-zw4dh5gn6b Год назад
вообще все ковариантно потому что есть object
@Awdesk_
@Awdesk_ 2 года назад
малый повзрослел
@Awdesk_
@Awdesk_ 2 года назад
уроки стали лучше, по сравнению с тем, что было
@ppc2012
@ppc2012 3 года назад
Главный вопрос: ну и зачем всё это надо?
@Bytepp
@Bytepp 3 года назад
Чтобы увидеть и ощутить красоту ООП))
@LuxDefensor
@LuxDefensor 3 года назад
@@Bytepp Спасибо, конечно, за видео, ценю ваши усилия, заслуженный лайк от меня. Но... Не знаю, как ppc2012, а я не удовлетворен ответом. Красота ООП штука очень субъективная, где одному видится красота, там другому - порнография. Потому реквестирую еще одно видео о реальном применении ко/контрвариантности, и желательно с объяснением, почему с ними лучше, чем без них. Ну, или может они в каких-то паттернах используются, про которые я не знаю (а я много чего не знаю), тогда про них. Я не придираюсь, просто эта тема - самая большая дырка в моих знаниях c#. В книгах и статьях подробно разбирают всю эту чрезмерно запутанную чушь (imho), но никто не говорит, для чего нужно ломать мозг. Мне пока ни разу не встретилась задача, которую я б не смог решить без этой фичи, и примеров на stackoverflow тоже. Это, понятно, не показатель, ну так ткните пальцем, куда смотреть, пожалуйста.
@ppc2012
@ppc2012 3 года назад
@@LuxDefensor Вопрос был больше риторическим, просто для того, чтобы указать, что такие сложные аспекты всегда порождают подобные вопросы. Попробую сам ответить. Во первых, для меня вариантность это в первую очередь такая вещь, которой приходится пользоваться крайне редко а сам я таких интерфейсов не пишу. Как-то вот удавалось всегда без такого обходиться. Эти штуки - ограничители, которые дают возможность указать компилятору на неверное неявное преобразование типов и получить ошибку компиляции, а не ошибку выполнения. Потому что вариантность не даётся по умолчанию. И если вы её используете, то значит указываете, что данный интерфейс может использовать данный тип только для входных или наоборот только для выходных методов. К примеру вы можете создать гараж(Garage : IStorable) для автомобилей, потом в другом месте программы использовать этот гараж как хранилище мерседесов IStorable mersedeses = cars. Это допустимо ровно потому что интерфейс должен использовать дженерик-тип только во входных методах. То есть в хранилище мы можем хранить мерседесы и это ок. А вот для того чтобы доставать из гаража машину нужно использовать другой интерфейс (Garage : IExtractable) И ошибки при попытке достать из гаража автомобилей мерседес или поставить его в гараж велосипедов возникнут при компиляции. Вот это по-моему и есть главная причина их существования. Кстати, в видео не сказано, что массивы в C# ковариантны по умолчанию. И это потенциальная проблема именно потому, что они допускают и помещение и извлечение данных. Mercedes[] mers = new Mercedes[5]; Cars[] cars = mers; //ok cars[0] = new Zaporozhets(); //runtime error;
@LuxDefensor
@LuxDefensor 3 года назад
@@ppc2012 Спасибо за развернутый ответ, попробую разобраться.
@sergeyt4118
@sergeyt4118 3 года назад
@@LuxDefensor у меня точно такой же вопрос назрел во время и после просмотра - на хрена все эти многослойны извращения? ради чего открываются эти ворота для адских багов, откидывая напрочь фундаментальные принципы KISS; я тоже до сих пор ищу ролики где мне человеческим языком объяснят какой у этой техники скрытый смысл оправдывающий такой уровень сложности; если нашли грааль - пож поделитесь ссылкой :)
@ImmortalBest
@ImmortalBest 3 года назад
Как там xamarin еще живет?
@Bytepp
@Bytepp 3 года назад
Наверное)) я им давно не занимался
@kingofbattleonline
@kingofbattleonline 2 года назад
Я не понимаю, видео про "Ковариантность и контравариантность". Почему первые 6 минут, я смотрел про то, как работать с обобщением?
@russianhotell
@russianhotell Год назад
Были показаны примеры, подводящие к понятию ко и контрвариантности
@kingofbattleonline
@kingofbattleonline Год назад
@@russianhotell это ошибка. В видео нет понятия примеры общений! Это учебный материал. Он должен подаваться людям в степени их знаний. Учитывая что уже проходили. Вы должны сопоставлять примеры кода, чтобы люди уже понимали что пишут. А не лепить в одном видео сразу несколько а то и более тем...
Далее
Me: Don't cross there's cars coming
00:16
Просмотров 2,2 млн
Лайфхак с колой не рабочий
00:16
Просмотров 275 тыс.
Кто Первый Получит Миллион ?
27:44
C# Covariance
17:27
Просмотров 7 тыс.