C#. Covariance and Contravariance in generic interfaces.

Поделиться
HTML-код
  • Опубликовано: 24 дек 2024

Комментарии •

  • @АндрійЯрута-е5б
    @АндрійЯрута-е5б 7 лет назад +188

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

  • @GorgeousPuree
    @GorgeousPuree 5 лет назад +40

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

  • @delalen8012
    @delalen8012 4 года назад +74

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

    • @Buarpa
      @Buarpa 4 года назад +1

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

    • @grimseal
      @grimseal 3 года назад +1

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

    • @yurademchenko9924
      @yurademchenko9924 3 года назад

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

    • @akstis4183
      @akstis4183 3 года назад +12

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

    • @vladimirmelnikov849
      @vladimirmelnikov849 3 года назад +1

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

  • @kombuchamp
    @kombuchamp 6 лет назад +36

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

  • @mikedastro2930
    @mikedastro2930 7 лет назад +191

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

    • @lllraytoxlll
      @lllraytoxlll 4 года назад +10

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

    • @radja_roman
      @radja_roman 4 года назад

      Так по жизни.

    • @chpogurt
      @chpogurt 3 года назад +4

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

    • @fj8017
      @fj8017 3 года назад +2

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

    • @РНС_Саакашвили
      @РНС_Саакашвили Год назад

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

  • @kombuchamp
    @kombuchamp 7 лет назад +3

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

  • @MrAgilator
    @MrAgilator 6 месяцев назад +1

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

  • @AlexBradley123
    @AlexBradley123 7 лет назад +35

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

    • @DS88579
      @DS88579 7 лет назад +3

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

  • @danylnovhorodov1165
    @danylnovhorodov1165 3 года назад +1

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

  • @june3878
    @june3878 Год назад

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

  • @denisadimov7709
    @denisadimov7709 7 лет назад +1

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

  • @Inignalf
    @Inignalf 5 лет назад +3

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

  • @russiafromtheinside2776
    @russiafromtheinside2776 5 лет назад +3

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

  • @MewMewCherry1990
    @MewMewCherry1990 4 года назад

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

  • @docal2
    @docal2 3 года назад +1

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

  • @Кристаллик-ь8н
    @Кристаллик-ь8н 7 лет назад +15

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

  • @Carrion-Crow
    @Carrion-Crow 7 лет назад +10

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

  • @sergbo5509
    @sergbo5509 5 лет назад +4

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

  • @SowilTM
    @SowilTM 5 лет назад +1

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

  • @halfbelf5923
    @halfbelf5923 7 лет назад

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

    • @MisterGenix
      @MisterGenix 4 года назад

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

  • @viktorion9703
    @viktorion9703 7 лет назад

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

  • @ivzaitsev
    @ivzaitsev 7 лет назад +9

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

  • @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 Что? Что ты сейчас написал.

  • @clumsy_weirdo
    @clumsy_weirdo 3 года назад

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

  • @lisafox9026
    @lisafox9026 6 лет назад +1

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

  • @ВадимПроценко-б4ф
    @ВадимПроценко-б4ф 6 лет назад

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

  • @GENprokurorful
    @GENprokurorful 6 лет назад +3

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

  • @GrafMKristo
    @GrafMKristo 7 лет назад

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

  • @tankowot
    @tankowot 7 лет назад +1

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

  • @STIGRADOR
    @STIGRADOR 5 месяцев назад

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

  • @lXmyl
    @lXmyl 4 года назад +2

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

  • @samirsalimkhanov3554
    @samirsalimkhanov3554 7 лет назад

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

  • @ivan_naitoraito
    @ivan_naitoraito 3 года назад

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

  • @xsanidasa9532
    @xsanidasa9532 7 лет назад +31

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

    • @xsanidasa9532
      @xsanidasa9532 7 лет назад +1

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

  • @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 ладно. Я просто хотел объяснить зачем нужны те или иные вещи, возможно было бы полезно.

  • @espadavlz
    @espadavlz 4 года назад

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

  • @volchiy_pisun
    @volchiy_pisun 6 лет назад +1

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

  • @sergs2919
    @sergs2919 3 года назад

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

  • @c4llv07e
    @c4llv07e 3 года назад

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

  • @Satmek
    @Satmek 7 лет назад

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

    • @ExtremeCode
      @ExtremeCode  7 лет назад

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

    • @andreikashin
      @andreikashin 7 лет назад

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

  • @DarkW1zard
    @DarkW1zard 3 года назад

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

  • @y78utrty76
    @y78utrty76 5 лет назад

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

  • @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 лет назад

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

  • @АнатолийГречко-и2п

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

  • @Алексей-р2л9д
    @Алексей-р2л9д 5 лет назад

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

  • @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

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

  • @andreyhello2367
    @andreyhello2367 4 года назад +1

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

  • @КлимНуралин-у4у
    @КлимНуралин-у4у 4 года назад

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

  • @МихаилХамхоев
    @МихаилХамхоев 6 лет назад +5

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

  • @andreikashin
    @andreikashin 7 лет назад

    ЛОООООООЙС!

  • @onlyrock1351
    @onlyrock1351 2 года назад

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

  • @Buarpa
    @Buarpa 4 года назад

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

  • @JustPlayingBroGD
    @JustPlayingBroGD 7 лет назад

    MVVM pls )

  • @ПавелСенко-э6д
    @ПавелСенко-э6д 3 года назад

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

  • @golubevvictor
    @golubevvictor 6 лет назад

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

  • @UnityFAN_unity
    @UnityFAN_unity 7 лет назад

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

    • @ExtremeCode
      @ExtremeCode  7 лет назад

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

  • @VonBreuss
    @VonBreuss 6 лет назад

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

  • @lisafox9026
    @lisafox9026 6 лет назад

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

  • @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 лет назад

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

  • @CriticalGaming-ru
    @CriticalGaming-ru 7 лет назад

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

  • @ilyaskhalitov5608
    @ilyaskhalitov5608 5 лет назад +6

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

  • @bogachyov
    @bogachyov 7 лет назад

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

    • @annyone3293
      @annyone3293 6 лет назад

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

  • @vladyslavshkola7486
    @vladyslavshkola7486 6 лет назад

    Песня

  • @vlife-m4b
    @vlife-m4b 7 лет назад

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

  • @igorcoolman
    @igorcoolman 7 лет назад +2

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

  • @mayonnaizzee
    @mayonnaizzee 5 лет назад +1

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

  • @S.D.Primus
    @S.D.Primus 8 месяцев назад

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

  • @virtusvirtus87
    @virtusvirtus87 7 лет назад

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

  • @NikolayFantom
    @NikolayFantom 7 лет назад

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

  • @Кирилл-ж3м2н
    @Кирилл-ж3м2н 7 лет назад

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