C#. Covariance and Contravariance in generic interfaces.

Sdílet
Vložit
  • čas přidán 22. 08. 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...

Komentáře • 130

  • @user-xi4kl9bq1u
    @user-xi4kl9bq1u Před 7 lety +188

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

  • @GorgeousPuree
    @GorgeousPuree Před 4 lety +35

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

  • @mikedastro2930
    @mikedastro2930 Před 6 lety +190

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

    • @lllraytoxlll
      @lllraytoxlll Před 3 lety +9

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

    • @radja_roman
      @radja_roman Před 3 lety

      Так по жизни.

    • @chpogurt
      @chpogurt Před 3 lety +4

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

    • @fj8017
      @fj8017 Před 2 lety +2

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

    • @user-zd3qw7le5c
      @user-zd3qw7le5c Před rokem

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

  • @delalen8012
    @delalen8012 Před 4 lety +69

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

    • @Buarpa
      @Buarpa Před 3 lety +1

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

    • @grimseal
      @grimseal Před 3 lety

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

    • @yurademchenko9924
      @yurademchenko9924 Před 3 lety

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

    • @akstis4183
      @akstis4183 Před 3 lety +12

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

    • @vladimirmelnikov849
      @vladimirmelnikov849 Před 2 lety +1

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

  • @kombuchamp
    @kombuchamp Před 6 lety +35

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

  • @MrAgilator
    @MrAgilator Před 2 měsíci +1

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

  • @AlexBradley123
    @AlexBradley123 Před 7 lety +35

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

    • @DS88579
      @DS88579 Před 7 lety +3

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

  • @kombuchamp
    @kombuchamp Před 6 lety +3

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

  • @user-wg9no7jy8b
    @user-wg9no7jy8b Před 7 lety +15

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

  • @denisadimov7709
    @denisadimov7709 Před 7 lety +1

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

  • @russiafromtheinside2776
    @russiafromtheinside2776 Před 5 lety +3

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

  • @Inignalf
    @Inignalf Před 4 lety +3

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

  • @Carrion-Crow
    @Carrion-Crow Před 7 lety +10

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

  • @septembercult985
    @septembercult985 Před 4 lety +23

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

    • @user-lh1pc6yn7x
      @user-lh1pc6yn7x Před 4 lety +1

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

    • @septembercult985
      @septembercult985 Před 4 lety +4

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

    • @ithangover589
      @ithangover589 Před 4 lety +1

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

    • @septembercult985
      @septembercult985 Před 4 lety +5

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

    • @ithangover589
      @ithangover589 Před 4 lety

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

  • @danylnovhorodov1165
    @danylnovhorodov1165 Před 3 lety +1

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

  • @xsanidasa9532
    @xsanidasa9532 Před 7 lety +31

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

    • @xsanidasa9532
      @xsanidasa9532 Před 7 lety +1

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

  • @june3878
    @june3878 Před rokem

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

  • @MewMewCherry1990
    @MewMewCherry1990 Před 3 lety

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

  • @ivzaitsev
    @ivzaitsev Před 7 lety +9

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

  • @sergbo5509
    @sergbo5509 Před 5 lety +4

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

  • @docal2
    @docal2 Před 3 lety +1

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

  • @GENprokurorful
    @GENprokurorful Před 6 lety +3

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

  • @SowilTM
    @SowilTM Před 4 lety +1

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

  • @user-yc4me1my1x
    @user-yc4me1my1x Před 6 lety

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

  • @viktorion9703
    @viktorion9703 Před 7 lety

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

  • @halfbelf5923
    @halfbelf5923 Před 6 lety

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

    • @MisterGenix
      @MisterGenix Před 4 lety

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

  • @mrspacer1
    @mrspacer1 Před 7 lety +21

    сложно!

    • @ExtremeCode
      @ExtremeCode  Před 7 lety +7

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

    • @Rodogor_Hoenhaym
      @Rodogor_Hoenhaym Před 7 lety +1

    • @ds6325
      @ds6325 Před 7 lety +3

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

    • @andreikashin
      @andreikashin Před 7 lety +1

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

    • @halfbelf5923
      @halfbelf5923 Před 7 lety +1

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

  • @GrafMKristo
    @GrafMKristo Před 7 lety

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

  • @lXmyl
    @lXmyl Před 4 lety +2

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

  • @clumsy_weirdo
    @clumsy_weirdo Před 3 lety

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

  • @volchiy_pisun
    @volchiy_pisun Před 6 lety +1

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

  • @samirsalimkhanov3554
    @samirsalimkhanov3554 Před 6 lety

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

  • @tankowot
    @tankowot Před 7 lety +1

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

  • @lisafox9026
    @lisafox9026 Před 5 lety +1

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

  • @STIGRADOR
    @STIGRADOR Před měsícem

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

  • @ivan_naitoraito
    @ivan_naitoraito Před 3 lety

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

  • @user-ji9rn2mc6z
    @user-ji9rn2mc6z Před 6 lety +5

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

  • @sergs2919
    @sergs2919 Před 3 lety

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

  • @c4llv07e
    @c4llv07e Před 3 lety

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

  • @andreyhello2367
    @andreyhello2367 Před 4 lety +1

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

  • @y78utrty76
    @y78utrty76 Před 5 lety

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

  • @user-oy9tf7im7e
    @user-oy9tf7im7e Před 7 lety

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

  • @DarkW1zard
    @DarkW1zard Před 3 lety

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

  • @onlyrock1351
    @onlyrock1351 Před 2 lety

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

  • @user-wb2rz4uu3l
    @user-wb2rz4uu3l Před 4 lety

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

  • @andreikashin
    @andreikashin Před 7 lety

    ЛОООООООЙС!

  • @espadavlz
    @espadavlz Před 4 lety

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

  • @user-oh5jk6kf4x
    @user-oh5jk6kf4x Před 4 lety

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

  • @ilyaskhalitov5608
    @ilyaskhalitov5608 Před 4 lety +6

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

  • @JustPlayingBroGD
    @JustPlayingBroGD Před 6 lety

    MVVM pls )

  • @golubevvictor
    @golubevvictor Před 5 lety

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

  • @user-ee6re8ii5d
    @user-ee6re8ii5d Před 3 lety

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

  • @Buarpa
    @Buarpa Před 3 lety

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

  • @Vadim-wi4by
    @Vadim-wi4by Před 4 lety

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

    • @alexander.777
      @alexander.777 Před 3 lety

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

    • @mrxprojects
      @mrxprojects Před 3 lety

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

    • @Vadim-wi4by
      @Vadim-wi4by Před 3 lety

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

    • @mrxprojects
      @mrxprojects Před 3 lety

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

    • @Vadim-wi4by
      @Vadim-wi4by Před 3 lety

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

  • @KirillBreuss
    @KirillBreuss Před 6 lety

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

  • @wd3rer
    @wd3rer Před 7 lety

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

  • @lisafox9026
    @lisafox9026 Před 5 lety

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

  • @UnityFAN_unity
    @UnityFAN_unity Před 7 lety

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

    • @ExtremeCode
      @ExtremeCode  Před 7 lety

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

  • @igorcoolman
    @igorcoolman Před 7 lety +2

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

  • @vlife-m4b
    @vlife-m4b Před 7 lety

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

  • @Satmek
    @Satmek Před 7 lety

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

    • @ExtremeCode
      @ExtremeCode  Před 7 lety

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

    • @andreikashin
      @andreikashin Před 7 lety

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

  • @vladyslavshkola7486
    @vladyslavshkola7486 Před 5 lety

    Песня

  • @Mexahoid
    @Mexahoid Před 7 lety

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

    • @ExtremeCode
      @ExtremeCode  Před 7 lety +2

      IntelliSens называется

    • @Mexahoid
      @Mexahoid Před 7 lety

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

    • @andreikashin
      @andreikashin Před 7 lety +1

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

    • @Mexahoid
      @Mexahoid Před 7 lety

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

    • @umka7873
      @umka7873 Před 6 lety

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

  • @S.D.Primus
    @S.D.Primus Před 3 měsíci

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

  • @vansoullive
    @vansoullive Před 7 lety

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

    • @ExtremeCode
      @ExtremeCode  Před 7 lety +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 Před 7 lety

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

    • @vansoullive
      @vansoullive Před 7 lety

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

    • @ExtremeCode
      @ExtremeCode  Před 7 lety

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

  • @bogachyov
    @bogachyov Před 7 lety

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

    • @annyone3293
      @annyone3293 Před 6 lety

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

  • @virtusvirtus87
    @virtusvirtus87 Před 7 lety

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

  • @mayonnaizzee
    @mayonnaizzee Před 5 lety +1

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

  • @user-wq2oq8st1u
    @user-wq2oq8st1u Před 7 lety

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

  • @NikolayFantom
    @NikolayFantom Před 7 lety

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