C#. Covariance and Contravariance in generic interfaces.

แชร์
ฝัง
  • เผยแพร่เมื่อ 2 ต.ค. 2024
  • C#. Covariance and Contravariance in generic interfaces.
    Hey, in this video we'll get acquainted with such creepy terms as Invariance, Co- and Contravariance and understand what the heck is that in terms of generic interfaces.
    ● VK: bit.ly/vk_extre...
    ● Telegram Chat: bit.ly/telegram...
    ● Twitter: bit.ly/twitter_...
    ● GitHub: bit.ly/github_e...

ความคิดเห็น • 130

  • @АндрійЯрута-е5б
    @АндрійЯрута-е5б 7 ปีที่แล้ว +189

    Я ничего не понял, но за видео спасибо. Так начнём ещё раз по новому.

  • @GorgeousPuree
    @GorgeousPuree 5 ปีที่แล้ว +37

    Ролики канала экстремального программирования относятся к тем обучающим видео, где тебе нужно замедлять видео, а не ускорять

  • @mikedastro2930
    @mikedastro2930 6 ปีที่แล้ว +190

    Я один такой - только подумал что хоть как то начал разбираться, так сразу лопатой по таблу ((

    • @lllraytoxlll
      @lllraytoxlll 3 ปีที่แล้ว +10

      мой мозг выдал ошибку на ключевом слове interface.

    • @radja_roman
      @radja_roman 3 ปีที่แล้ว

      Так по жизни.

    • @chpogurt
      @chpogurt 3 ปีที่แล้ว +4

      я поломался когда он к интерфейсам " where T:" начал приписывать

    • @fj8017
      @fj8017 3 ปีที่แล้ว +2

      @@chpogurt Ключевое слово where позволяет ограничить обобщение. В данном случае интерфейсу ICar в можно указать только Engine и его наследников. Иногда бывает полезно.

    • @РНС_Саакашвили
      @РНС_Саакашвили ปีที่แล้ว

      @@fj8017 Скажите пожалста - почему так . . . 3:35 . . . в иерархии наследования интерфейс ICar и класс Lada находятся на ОДНОМ УРОВНЕ ??????????. Но ведь тут имеет место НАСЛЕДОВАНИЕ (class Lada : ICar) и поэтому интерфейс БАЗОВЫЙ КЛАСС для класса Lada

  • @delalen8012
    @delalen8012 4 ปีที่แล้ว +71

    Я покопался, почитал, посмотрел видос и вроде бы понял кое-что, поделюсь с вами)
    Есть принцип подстановки Лисков, в котором говорится следующее:
    должна существовать возможность использовать объекты производного класса. Это значит, что объекты производного класса должны вести себя согласованно, согласно контракту базового класса.
    Под контрактом класса понимается ожидаемое от него поведение. Представим, что у родительского и класса наследника разные контракты, то есть, работают они настолько по-разному, что нам придется в коде этот класс наследник обрабатывать по особому, а не как наследника базового класса. Тут же теряется суть наследования - использование класса наследника как базовый класс.
    Поэтому, когда мы думаем, можно ли сделать какой-то класс наследником другого, нам нужно учитывать не только размытое правило: спроси себя есть между классом-наследником и родительским классом отношение "является". Нам нужно также учитывать, что их контракты будут СОГЛАСОВАННЫМИ. То есть, во время работы программы, мы должны знать, чего ожидать от наследников какого-то класса и не думать о том, что их надо как-то по специальному обрабатывать, ведь у них почему то есть такая функциональность, которая не согласуется с базовым классом.
    Но, если объекты всё таки связать в одну иерархию хочется, а контракты их разные, это совсем на значит, что сделать это невозможно.
    А что, есть сделать эти классы immutable, то есть, неизменяемыми? У неизменяемого класса нельзя менять его данные, после того, как он был создан. Если данные менять нельзя, значит, исчезают методы обработки этих данных (зачем методы обработки, если данные неизменяемые?). То есть, мы можем лишь достать что-то оттуда (геттер, например). Что это означает? Это означает, никакой класс не сможет сделать что-то с нашими данными. Не сможет сделать что-то такое, что способно сделать их невалидными.
    Именно этой же логики следуют правила ковариантности и контравариантности обобщений в языке C#. Так, именно отсутствие изменяемости, позволяет трактовать объект IEnumerable как IEnumerable. Поскольку мы можем лишь достать элемент из последовательности и не можем положить его обратно, то такое преобразование является типобезопасным.

    • @Buarpa
      @Buarpa 3 ปีที่แล้ว +1

      вот есть такие люди как я, которые осилили только 1,2,5 абзацы, не пиши пожалуйста столь длинных комментариев : \ невозможно читать ...
      это как в примере с игнорированием проблемы ... если ты не можешь игнорировать проблему, декомпозируй её на много маленьких частей, маленькие проблемы игнорировать легче :D
      продолжай комментарий под своим комментарием, и все люди смогут прочитать всё что их будет интересовать :D
      а вообще, в последнем абзаце объяснил круто.

    • @grimseal
      @grimseal 3 ปีที่แล้ว

      Весьма интересное наблюдение. Спасибо тебе, добрый человек!

    • @yurademchenko9924
      @yurademchenko9924 3 ปีที่แล้ว

      Благодарю. Четко и понятно описал. Лайк за комментарий.

    • @akstis4183
      @akstis4183 3 ปีที่แล้ว +12

      @@Buarpa вот оно - проявление клипового мышления

    • @vladimirmelnikov849
      @vladimirmelnikov849 2 ปีที่แล้ว +1

      Спасибо большое. Действительно, после вашего комментария всё встало на свои места

  • @kombuchamp
    @kombuchamp 6 ปีที่แล้ว +35

    Я этот ролик раз третий смотрю с промежутками в полгода, кажись, теперь дошло

  • @Кристаллик-ь8н
    @Кристаллик-ь8н 7 ปีที่แล้ว +15

    Цитата из видео: "Пока всё логично...", так вот, может и логично, но нихрена не понятно

  • @Carrion-Crow
    @Carrion-Crow 7 ปีที่แล้ว +10

    Слишком опасно и не представляю себе задачу где это бы было необходимо только если кто то уже написал не продуманный не расширяемый код и тебе нужно туда заснуть целого кинконга тогда да

  • @xsanidasa9532
    @xsanidasa9532 7 ปีที่แล้ว +31

    Щта это было ?? блин видимо я ещё слишком маленький и тупой)

    • @xsanidasa9532
      @xsanidasa9532 7 ปีที่แล้ว +1

      оставлю вкусное на потом , на самый самый кончик

  • @MrAgilator
    @MrAgilator 3 หลายเดือนก่อน +1

    Благодарю автора за труды!! Посмотрел 2-й раз - кое-что начало проясняться )) Пойду ещё покурю мануалы и вернусь - думаю, будет ещё понятнее ))

  • @septembercult985
    @septembercult985 5 ปีที่แล้ว +23

    Нихуя не понял, но очень интересно.
    Сижу я, читаю книжку по С#, смотрю видосики и волосы везде шевелятся. В какую срань же я влез...

    • @РоманКанарейкин
      @РоманКанарейкин 4 ปีที่แล้ว +1

      Брось книги читать. Программируй, там все на много легче

    • @septembercult985
      @septembercult985 4 ปีที่แล้ว +4

      @@РоманКанарейкин Конечно, книги же для тупых. Зачем их вообще пишут?
      (Я, кстати, уже с момента написания поста на работу устроился и зарабатываю на C#)

    • @ithangover589
      @ithangover589 4 ปีที่แล้ว +1

      @@septembercult985 Не одну книгу не прочёл, middle + C#, и что сказать ещё хочешь?

    • @septembercult985
      @septembercult985 4 ปีที่แล้ว +5

      @@ithangover589 Только то, что ты пишешь с ошибками и не понимаешь, что написано. Я где-то сказал, что их читать обязательно?
      Какой ты нах миддл, если ты прочитать внимательно беседу не в состоянии?

    • @ithangover589
      @ithangover589 4 ปีที่แล้ว

      @@septembercult985 Что? Что ты сейчас написал.

  • @sergbo5509
    @sergbo5509 5 ปีที่แล้ว +4

    На счет того что ковариантность и контрвариантность плюют на строгую типизацию это не совсем так, поскольку как только вы их применяете, на методы интерфейса как раз и налагаются ограничения по поводу возвращаемого типа и типа аргумента. Так что этот вопрос освещен не полностью в частности зачем применяются такие ограничения. Автор либо сам не знает либо очень спешил... куда-то. Видимо друзья перед записью видео позвонили и пригласили пить пиво, а тут ролик еще не готов))

  • @AlexBradley123
    @AlexBradley123 7 ปีที่แล้ว +35

    Наконец-то нашёл канал, где объясняют что-то, чего я не знаю.) Лайк и подписка.)
    Очень хочется человеческим и простым языком услышать про асинхронные операции, Task, async - await и прочую дичь. Вроде я понимаю, что они делают, но есть мнение, что я что-то упускаю.)

    • @DS88579
      @DS88579 7 ปีที่แล้ว +3

      Посмотрите канал "Программирование - это просто"

  • @ivzaitsev
    @ivzaitsev 7 ปีที่แล้ว +9

    Выглядит и смотрится как краткий пересказ clr via c# Рихтера, то есть очень пиздато. А когда mvvm будет?

  • @МихаилХамхоев
    @МихаилХамхоев 6 ปีที่แล้ว +5

    пиздец комменты, прикольная аудитория у тебя

  • @russiafromtheinside2776
    @russiafromtheinside2776 5 ปีที่แล้ว +3

    Контрвариантность очень даже нужная штука, в контексте обобщенных делегатов.

  • @GENprokurorful
    @GENprokurorful 6 ปีที่แล้ว +3

    ещё разок и точно пойму.. больше чем 5 реплаев назад.

  • @kombuchamp
    @kombuchamp 7 ปีที่แล้ว +3

    Я ничего не понимаю, что вы говорите, но это так интересно

  • @lXmyl
    @lXmyl 4 ปีที่แล้ว +2

    Почему нельзя показать весь написанный код на одном экране? В этом мельтишении слайдов невозможно что-то понять, приходится самому все переписывать.

  • @docal2
    @docal2 3 ปีที่แล้ว +1

    Вот что ни говори про Майкрософт, но они умеют учиться на чужих ошибках. В джаве пришлось изобрести мнемонику PECS (Producer Extends Consumer Super), чтобы запомнить когда используется super, а когда extends. А тут всё просто и наглядно, in и out.

  • @mrspacer1
    @mrspacer1 7 ปีที่แล้ว +21

    сложно!

    • @ExtremeCode
      @ExtremeCode  7 ปีที่แล้ว +7

      Да тема не простая, и не факт что на данный момент нужная пока всем подряд :)

    • @Rodogor_Hoenhaym
      @Rodogor_Hoenhaym 7 ปีที่แล้ว +1

    • @ds6325
      @ds6325 7 ปีที่แล้ว +3

      ждем выпуска этой темы для маленьких и тупых =D

    • @andreikashin
      @andreikashin 7 ปีที่แล้ว +1

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

    • @halfbelf5923
      @halfbelf5923 7 ปีที่แล้ว +1

      я как раз сейчас с этой темой е****, ищу инфу выдают, только такую натянутую, что я просто хочу взять молот и с улыбкой на лице расхерачить ноут. У меня лишь несколько вопросов, нахера это надо? где применять? и как это юзать? Надеюсь в следующем ролики вы опишите данную тему. Спасибо за ролик с меня как всегда лайк.

  • @Inignalf
    @Inignalf 5 ปีที่แล้ว +3

    Ничего не понятно, но очень интересно

  • @danylnovhorodov1165
    @danylnovhorodov1165 3 ปีที่แล้ว +1

    Ха-ха, автор красава. Разложил для маслят. Если кратко то ковариантность гарантирует type safety для возвращаемых типов, контрвариантность для параметров ну или входных типочков

  • @lisafox9026
    @lisafox9026 5 ปีที่แล้ว +1

    Как я поняла, ковариантны если могут использовать наследственность а НЕковариантны, это жестко прописано что слева то и справа? похож на джава... массивы ковариантны, но при получении можно огрести exception, а коллекции НЕковариантны. .. где я?

  • @STIGRADOR
    @STIGRADOR 2 หลายเดือนก่อน

    Вопрос: почему ты во всех видосах говоришь так, будто улыбаешься?)

  • @ilyaskhalitov5608
    @ilyaskhalitov5608 4 ปีที่แล้ว +6

    Контрвариативность применяется как входной метод аргументов обобщений. Применяется часто и вещь очень логичная. Вообщем дизлайк

  • @S.D.Primus
    @S.D.Primus 5 หลายเดือนก่อน

    Порусски пиши, совариантность и противоварианиность.

  • @igorcoolman
    @igorcoolman 7 ปีที่แล้ว +2

    нихера не понял

  • @mayonnaizzee
    @mayonnaizzee 5 ปีที่แล้ว +1

    Словил кринж с одного названия

  • @SowilTM
    @SowilTM 5 ปีที่แล้ว +1

    Отличный канал и формат, спасибо, а то от нудного "бубнежа" у некоторых авторов, можно уснуть.

  • @volchiy_pisun
    @volchiy_pisun 6 ปีที่แล้ว +1

    мозг плавится... но спасибо за видео

  • @andreyhello2367
    @andreyhello2367 4 ปีที่แล้ว +1

    Нихуя не понял, но очень интересно

  • @onlyrock1351
    @onlyrock1351 2 ปีที่แล้ว

    а когда делегаты(((

  • @denisadimov7709
    @denisadimov7709 7 ปีที่แล้ว +1

    Отдельное спасибо за эту тему, очень много искал где узнать больше о ковариантности и контравариантности. Так держать ;)

  • @КлимНуралин-у4у
    @КлимНуралин-у4у 4 ปีที่แล้ว

    Абсолютно все классы наследованы от Object, а типы значений неявно расширяют ValueType

  • @c4llv07e
    @c4llv07e 3 ปีที่แล้ว

    Ну надо же было слово "in" зарезервировать, вот и добавили контрвариантность, чего думать-то :?

  • @june3878
    @june3878 ปีที่แล้ว

    Это лучшее объяснение на youtube

  • @DarkW1zard
    @DarkW1zard 3 ปีที่แล้ว

    У меня для таких роликов в закладках по c# есть отдельная папочка с именем "*опа".

  • @ПавелСенко-э6д
    @ПавелСенко-э6д 3 ปีที่แล้ว

    Тот кто это знает и то не сразу вас поймет. Для обучения есть вполне адекватные уроки.

  • @lisafox9026
    @lisafox9026 5 ปีที่แล้ว

    примеры со сложными цифрами машин в названии, очень сбивают с толку и так сложную тему. Icar834-- toooo much .. короче нету хорошего видео

  • @clumsy_weirdo
    @clumsy_weirdo 3 ปีที่แล้ว

    choП is dish? очень интересно, давай еще!

  • @KirillBreuss
    @KirillBreuss 6 ปีที่แล้ว

    Я вот совсем маленький и тупой.) Я вот вообще ниче не понял.)))

  • @ivan_naitoraito
    @ivan_naitoraito 3 ปีที่แล้ว

    ничего непонятно, но очень интересно

  • @tankowot
    @tankowot 7 ปีที่แล้ว +1

    огонь))) дрьмо что надо)) лойс) пиши еще

  • @Buarpa
    @Buarpa 3 ปีที่แล้ว

    пример начиная с 3:03 не понятен :*(

  • @espadavlz
    @espadavlz 4 ปีที่แล้ว

    2:26 Разве не только массивы ссылочных типов ковариантны?

  • @virtusvirtus87
    @virtusvirtus87 7 ปีที่แล้ว

    сложна, сложна, нихуя не панятна

  • @UnityFAN_unity
    @UnityFAN_unity 7 ปีที่แล้ว

    Бля помню когда то убил на это тему хуеву кучу времени, в результате на практике очень мало встречался с подобным...

    • @ExtremeCode
      @ExtremeCode  7 ปีที่แล้ว

      Да, есть такое :D
      Хотя ковариантность может пригодится, но там и сложного то особо ничего нет :D

  • @y78utrty76
    @y78utrty76 5 ปีที่แล้ว

    Никак в голове не уложиться =( жесть блин

  • @golubevvictor
    @golubevvictor 5 ปีที่แล้ว

    Уточка логичней контрвариантности.

  • @sergs2919
    @sergs2919 3 ปีที่แล้ว

    Интересненько конечно..

  • @Алексей-р2л9д
    @Алексей-р2л9д 4 ปีที่แล้ว

    А вот сейчас больно было

  • @MewMewCherry1990
    @MewMewCherry1990 3 ปีที่แล้ว

    Очень понятно и интересно обьясняете. Спасибо за урок

  • @ВадимПроценко-б4ф
    @ВадимПроценко-б4ф 6 ปีที่แล้ว

    очень интересно) спасибо))прям по полочкам))

  • @АнатолийГречко-и2п
    @АнатолийГречко-и2п 7 ปีที่แล้ว

    Еще есть инвариантность )

  • @Кирилл-ж3м2н
    @Кирилл-ж3м2н 7 ปีที่แล้ว

    Нихуя не понял :(

  • @viktorion9703
    @viktorion9703 7 ปีที่แล้ว

    Блин как же много годности

  • @JustPlayingBroGD
    @JustPlayingBroGD 6 ปีที่แล้ว

    MVVM pls )

  • @vladyslavshkola7486
    @vladyslavshkola7486 5 ปีที่แล้ว

    Песня

  • @halfbelf5923
    @halfbelf5923 6 ปีที่แล้ว

    сначала я не понял, потом пошел читать книги и статейки, и потом зашел на этот видос, и все стало понятно, перед просмотром советую прочитать и по практиковаться в студии самим.

    • @MisterGenix
      @MisterGenix 4 ปีที่แล้ว

      И можно видео не смотреть тогда уж :)

  • @samirsalimkhanov3554
    @samirsalimkhanov3554 6 ปีที่แล้ว

    Ништяк!!! молодец

  • @wd3rer
    @wd3rer 7 ปีที่แล้ว

    моск сломался(

  • @bogachyov
    @bogachyov 7 ปีที่แล้ว

    Лучше пойду учить JavaScript

    • @annyone3293
      @annyone3293 6 ปีที่แล้ว

      Ярослав Богачёв, там сплошная ковариантность, динамика - ну его в ****.

  • @Satmek
    @Satmek 7 ปีที่แล้ว

    Т.е. клвариантый интерфейс может описывать только методы?

    • @ExtremeCode
      @ExtremeCode  7 ปีที่แล้ว

      get свойства еще 4:33

    • @andreikashin
      @andreikashin 7 ปีที่แล้ว

      а гет_проп и метод - это не одно и то же, если опустить все плюшки с сахаром?

  • @vansoullive
    @vansoullive 7 ปีที่แล้ว

    Не понимаю, что обозначает эта строка
    ICar vEngineCar = lada;
    Типа приводим интерфейс к экземпляру класса, но что, блять, это обозначает?

    • @ExtremeCode
      @ExtremeCode  7 ปีที่แล้ว +5

      Ну вот смотри, у нас допустим есть пара машинок с двигателем V8, затем мы добавили еще пару машинок но уже с двигателями V6, V4, и так далее. И у нас тут уже намечается целый автопарк. По умолчанию мы можем создавать коллекции только с машинами определенного двигателя, потому что нас ограничивает инвариантность
      То есть что то в духе
      List veightCars = new List();
      Но допустим нам надо просто провести какую либо работу со всеми машинами сразу, и при этом нам абсолютно не важно какой именно двигатель установлен на машине. Тут применяется тема из видео - мы тупо используем ковариантность для интерфейса, и теперь все различные машины с разными двигателям (читай как куча разных типов) можем привести к одному единственному типу
      List cars = new List();
      И это позволит нам добавлять в одну коллекцию машины с разными двигателями
      cars.Add(new Lada());
      cars.Add(new Bmw());
      cars.Add(new Mercedes());
      P.S.
      Приводим не интерфейс к экземпляру класса, тут правильно читать слева направо - приводим экземпляр класса к типу ICar

    • @romanbrazhnikov9049
      @romanbrazhnikov9049 7 ปีที่แล้ว

      ExtremeCode было б неплохо ещё объяснить почему *вариантности вообще существуют и что же там под капотом происходит когда запиливаем "out" и "in"

    • @vansoullive
      @vansoullive 7 ปีที่แล้ว

      Окей, это вроде понятно, но что нам дает обобщенный список интерфейсов, что мы с ними сможем делать?
      Вообще, что обозначает переменная с типом интерфейс(например, ICar, это же тип, я правильно понимаю?), много где видел, но не понимал сути, поэтому и спросил про конкретную строку)
      P.S. Спасибо за ремарку, не заметил. И я так понимаю, вы хотели написать справа налево.

    • @ExtremeCode
      @ExtremeCode  7 ปีที่แล้ว

      Почитай про обобщения в интерфейсах, в наших обычных уроках мы не скоро еще дойдем до туда

  • @vlife-m4b
    @vlife-m4b 7 ปีที่แล้ว

    Лада Лада Лада

  • @andreikashin
    @andreikashin 7 ปีที่แล้ว

    ЛОООООООЙС!

  • @Vadim-wi4by
    @Vadim-wi4by 4 ปีที่แล้ว

    Единственный вопрос - а науя это надо? Мы же можем использовать ArrayList, в который можем запихнуть объекты разного типа. Останется только достать оттуда элементы, приведя их к изначальному типу.

    • @alexander.777
      @alexander.777 3 ปีที่แล้ว

      И при каждом чихе будет происходить упаковка (boxing) и распаковка (unboxing), что ведет к снижению производительности, если данные при этом не ссылочного типа.

    • @mrxprojects
      @mrxprojects 3 ปีที่แล้ว

      В шарпе ваще дохера наворочено ненужного, чего многие никогда даже не будут использовать, зато мозг будет взрываться при изучении.

    • @Vadim-wi4by
      @Vadim-wi4by 3 ปีที่แล้ว

      @@mrxprojects например?

    • @mrxprojects
      @mrxprojects 3 ปีที่แล้ว

      @@Vadim-wi4by я бы ответил но зае* перечислять

    • @Vadim-wi4by
      @Vadim-wi4by 3 ปีที่แล้ว

      @@mrxprojects ладно. Я просто хотел объяснить зачем нужны те или иные вещи, возможно было бы полезно.

  • @Mexahoid
    @Mexahoid 7 ปีที่แล้ว

    Что за утилитка подсвечивает несуществующие типы красным при вводе?

    • @ExtremeCode
      @ExtremeCode  7 ปีที่แล้ว +2

      IntelliSens называется

    • @Mexahoid
      @Mexahoid 7 ปีที่แล้ว

      То, что IS эт понятно. Как настроить его так? У меня VS 2017.

    • @andreikashin
      @andreikashin 7 ปีที่แล้ว +1

      Лошарпер ставь

    • @Mexahoid
      @Mexahoid 7 ปีที่แล้ว

      Годно, но жаба душит тратить кучу президентов ради лошарпера для своих приблудопрограмм.
      P.S. не Та жаба.

    • @umka7873
      @umka7873 6 ปีที่แล้ว

      Пожизненый триал в нем есть, юный Джедай.

  • @GrafMKristo
    @GrafMKristo 7 ปีที่แล้ว

    Чёткое объяснение! Лучшее, что я видел.
    ЗЫ: с сабжем уже знаком, смотрел из великого уважения к каналу.

  • @NikolayFantom
    @NikolayFantom 7 ปีที่แล้ว

    Пацаны, если не сложно, запилите тутор как настроить юнити под фейсбук геймрум, нигде нет информации, явно срубите просмотров и донатов.