Я может быть чего-то не понимаю, подскажите пожалуйста, если ошибаюсь: 1) в видео 3 примера 2) 1 пример для ввода, сказано, что в нем нет ни ковариантности ни контр-ти 3:10 3) 2 пример - показывает, что такое ковариантность (апкаст по типам), то есть у нас Garage -> IGarage от которого наследуется и его параметр, тип, передаем mercedes получаем Car 4) 3 пример - показывает, что такое контрвариантность (downCast), где, по сути все наоборот Но вот что мне не до конца понятно, если в видео говорится, что в 2м примере (upcast) выполняется в двух местах, это от производного класса к интерфейсу, от которого он наследуется и сам параметр, то что мы передаем от mercedes -> Car, то в первом примере есть тоже по сути upcast - это 32 строка (из Garage -> в IGarage), но просто с таким же типом параметра, то есть выполняется upcast класса же ?. Вот с этим я что-то совсем запутался.
@@Bytepp Спасибо, конечно, за видео, ценю ваши усилия, заслуженный лайк от меня. Но... Не знаю, как ppc2012, а я не удовлетворен ответом. Красота ООП штука очень субъективная, где одному видится красота, там другому - порнография. Потому реквестирую еще одно видео о реальном применении ко/контрвариантности, и желательно с объяснением, почему с ними лучше, чем без них. Ну, или может они в каких-то паттернах используются, про которые я не знаю (а я много чего не знаю), тогда про них. Я не придираюсь, просто эта тема - самая большая дырка в моих знаниях c#. В книгах и статьях подробно разбирают всю эту чрезмерно запутанную чушь (imho), но никто не говорит, для чего нужно ломать мозг. Мне пока ни разу не встретилась задача, которую я б не смог решить без этой фичи, и примеров на stackoverflow тоже. Это, понятно, не показатель, ну так ткните пальцем, куда смотреть, пожалуйста.
@@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 у меня точно такой же вопрос назрел во время и после просмотра - на хрена все эти многослойны извращения? ради чего открываются эти ворота для адских багов, откидывая напрочь фундаментальные принципы KISS; я тоже до сих пор ищу ролики где мне человеческим языком объяснят какой у этой техники скрытый смысл оправдывающий такой уровень сложности; если нашли грааль - пож поделитесь ссылкой :)
@@russianhotell это ошибка. В видео нет понятия примеры общений! Это учебный материал. Он должен подаваться людям в степени их знаний. Учитывая что уже проходили. Вы должны сопоставлять примеры кода, чтобы люди уже понимали что пишут. А не лепить в одном видео сразу несколько а то и более тем...
Отлично, теперь всё понятно!)
Спасибо🙏
Здорово. Теперь все понятно.
Ты просто создан объяснять!)
Какую проблему решают они?
Хорошее объяснение, если кто-то не понял, то еще на метаните посмотрите.
Я может быть чего-то не понимаю, подскажите пожалуйста, если ошибаюсь:
1) в видео 3 примера
2) 1 пример для ввода, сказано, что в нем нет ни ковариантности ни контр-ти 3:10
3) 2 пример - показывает, что такое ковариантность (апкаст по типам), то есть у нас Garage -> IGarage от которого наследуется и его параметр, тип, передаем mercedes получаем Car
4) 3 пример - показывает, что такое контрвариантность (downCast), где, по сути все наоборот
Но вот что мне не до конца понятно, если в видео говорится, что в 2м примере (upcast) выполняется в двух местах, это от производного класса к интерфейсу, от которого он наследуется и сам параметр, то что мы передаем от mercedes -> Car, то в первом примере есть тоже по сути upcast - это 32 строка (из Garage -> в IGarage), но просто с таким же типом параметра, то есть выполняется upcast класса же ?. Вот с этим я что-то совсем запутался.
Спасибо!
Ковариантность и контрвариантность относится к интерфейсам и делегатам, так же одна только ковариантность присуща массивам ссылочных типов
вообще все ковариантно потому что есть object
разве они отсекаются? они же просто прайват становятся и это тип инкапсуляция
наверное в конструкторе должно быть не поле а свойство - вот так
CarPlace = car;
Главный вопрос: ну и зачем всё это надо?
Чтобы увидеть и ощутить красоту ООП))
@@Bytepp Спасибо, конечно, за видео, ценю ваши усилия, заслуженный лайк от меня. Но... Не знаю, как ppc2012, а я не удовлетворен ответом. Красота ООП штука очень субъективная, где одному видится красота, там другому - порнография. Потому реквестирую еще одно видео о реальном применении ко/контрвариантности, и желательно с объяснением, почему с ними лучше, чем без них. Ну, или может они в каких-то паттернах используются, про которые я не знаю (а я много чего не знаю), тогда про них. Я не придираюсь, просто эта тема - самая большая дырка в моих знаниях c#. В книгах и статьях подробно разбирают всю эту чрезмерно запутанную чушь (imho), но никто не говорит, для чего нужно ломать мозг. Мне пока ни разу не встретилась задача, которую я б не смог решить без этой фичи, и примеров на stackoverflow тоже. Это, понятно, не показатель, ну так ткните пальцем, куда смотреть, пожалуйста.
@@LuxDefensor Вопрос был больше риторическим, просто для того, чтобы указать, что такие сложные аспекты всегда порождают подобные вопросы. Попробую сам ответить. Во первых, для меня вариантность это в первую очередь такая вещь, которой приходится пользоваться крайне редко а сам я таких интерфейсов не пишу. Как-то вот удавалось всегда без такого обходиться. Эти штуки - ограничители, которые дают возможность указать компилятору на неверное неявное преобразование типов и получить ошибку компиляции, а не ошибку выполнения. Потому что вариантность не даётся по умолчанию. И если вы её используете, то значит указываете, что данный интерфейс может использовать данный тип только для входных или наоборот только для выходных методов. К примеру вы можете создать гараж(Garage : IStorable) для автомобилей, потом в другом месте программы использовать этот гараж как хранилище мерседесов IStorable mersedeses = cars. Это допустимо ровно потому что интерфейс должен использовать дженерик-тип только во входных методах. То есть в хранилище мы можем хранить мерседесы и это ок. А вот для того чтобы доставать из гаража машину нужно использовать другой интерфейс (Garage : IExtractable) И ошибки при попытке достать из гаража автомобилей мерседес или поставить его в гараж велосипедов возникнут при компиляции. Вот это по-моему и есть главная причина их существования. Кстати, в видео не сказано, что массивы в C# ковариантны по умолчанию. И это потенциальная проблема именно потому, что они допускают и помещение и извлечение данных.
Mercedes[] mers = new Mercedes[5];
Cars[] cars = mers; //ok
cars[0] = new Zaporozhets(); //runtime error;
@@ppc2012 Спасибо за развернутый ответ, попробую разобраться.
@@LuxDefensor у меня точно такой же вопрос назрел во время и после просмотра - на хрена все эти многослойны извращения? ради чего открываются эти ворота для адских багов, откидывая напрочь фундаментальные принципы KISS; я тоже до сих пор ищу ролики где мне человеческим языком объяснят какой у этой техники скрытый смысл оправдывающий такой уровень сложности; если нашли грааль - пож поделитесь ссылкой :)
Как там xamarin еще живет?
Наверное)) я им давно не занимался
малый повзрослел
уроки стали лучше, по сравнению с тем, что было
Я не понимаю, видео про "Ковариантность и контравариантность". Почему первые 6 минут, я смотрел про то, как работать с обобщением?
Были показаны примеры, подводящие к понятию ко и контрвариантности
@@russianhotell это ошибка. В видео нет понятия примеры общений! Это учебный материал. Он должен подаваться людям в степени их знаний. Учитывая что уже проходили. Вы должны сопоставлять примеры кода, чтобы люди уже понимали что пишут. А не лепить в одном видео сразу несколько а то и более тем...