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

แชร์
ฝัง
  • เผยแพร่เมื่อ 19 ธ.ค. 2024

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

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

    Отлично, теперь всё понятно!)
    Спасибо🙏

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

    Здорово. Теперь все понятно.

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

    Ты просто создан объяснять!)

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

    Какую проблему решают они?

  • @оооСерыйооо
    @оооСерыйооо 2 ปีที่แล้ว

    Хорошее объяснение, если кто-то не понял, то еще на метаните посмотрите.

  • @alexeyfranchuk3038
    @alexeyfranchuk3038 8 หลายเดือนก่อน

    Я может быть чего-то не понимаю, подскажите пожалуйста, если ошибаюсь:
    1) в видео 3 примера
    2) 1 пример для ввода, сказано, что в нем нет ни ковариантности ни контр-ти 3:10
    3) 2 пример - показывает, что такое ковариантность (апкаст по типам), то есть у нас Garage -> IGarage от которого наследуется и его параметр, тип, передаем mercedes получаем Car
    4) 3 пример - показывает, что такое контрвариантность (downCast), где, по сути все наоборот
    Но вот что мне не до конца понятно, если в видео говорится, что в 2м примере (upcast) выполняется в двух местах, это от производного класса к интерфейсу, от которого он наследуется и сам параметр, то что мы передаем от mercedes -> Car, то в первом примере есть тоже по сути upcast - это 32 строка (из Garage -> в IGarage), но просто с таким же типом параметра, то есть выполняется upcast класса же ?. Вот с этим я что-то совсем запутался.

  • @АлексейВарнавский-щ8д
    @АлексейВарнавский-щ8д 2 ปีที่แล้ว

    Спасибо!

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

    Ковариантность и контрвариантность относится к интерфейсам и делегатам, так же одна только ковариантность присуща массивам ссылочных типов

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

    разве они отсекаются? они же просто прайват становятся и это тип инкапсуляция

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

    наверное в конструкторе должно быть не поле а свойство - вот так
    CarPlace = car;

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

    Главный вопрос: ну и зачем всё это надо?

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

      Чтобы увидеть и ощутить красоту ООП))

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

      @@Bytepp Спасибо, конечно, за видео, ценю ваши усилия, заслуженный лайк от меня. Но... Не знаю, как ppc2012, а я не удовлетворен ответом. Красота ООП штука очень субъективная, где одному видится красота, там другому - порнография. Потому реквестирую еще одно видео о реальном применении ко/контрвариантности, и желательно с объяснением, почему с ними лучше, чем без них. Ну, или может они в каких-то паттернах используются, про которые я не знаю (а я много чего не знаю), тогда про них. Я не придираюсь, просто эта тема - самая большая дырка в моих знаниях c#. В книгах и статьях подробно разбирают всю эту чрезмерно запутанную чушь (imho), но никто не говорит, для чего нужно ломать мозг. Мне пока ни разу не встретилась задача, которую я б не смог решить без этой фичи, и примеров на stackoverflow тоже. Это, понятно, не показатель, ну так ткните пальцем, куда смотреть, пожалуйста.

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

      @@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 4 ปีที่แล้ว +1

      @@ppc2012 Спасибо за развернутый ответ, попробую разобраться.

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

      @@LuxDefensor у меня точно такой же вопрос назрел во время и после просмотра - на хрена все эти многослойны извращения? ради чего открываются эти ворота для адских багов, откидывая напрочь фундаментальные принципы KISS; я тоже до сих пор ищу ролики где мне человеческим языком объяснят какой у этой техники скрытый смысл оправдывающий такой уровень сложности; если нашли грааль - пож поделитесь ссылкой :)

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

    Как там xamarin еще живет?

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

      Наверное)) я им давно не занимался

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

    малый повзрослел

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

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

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

    Я не понимаю, видео про "Ковариантность и контравариантность". Почему первые 6 минут, я смотрел про то, как работать с обобщением?

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

      Были показаны примеры, подводящие к понятию ко и контрвариантности

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

      @@russianhotell это ошибка. В видео нет понятия примеры общений! Это учебный материал. Он должен подаваться людям в степени их знаний. Учитывая что уже проходили. Вы должны сопоставлять примеры кода, чтобы люди уже понимали что пишут. А не лепить в одном видео сразу несколько а то и более тем...