C# programming. Lesson 6. Interfaces

  Переглядів 91,218

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

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

10 років тому

Рассматривается, что такое интерфейс, где и зачем его использовать, чем он отличается от абстрактных классов, как он применяется во встроенных механизмах .NET Framework.
Ссылки на предыдущие уроки:
Урок 5. Запечатанные, статические и абстрактные классы. • Уроки C#. Запечатанные...
Урок 4. Наследование и полиморфизм. • Уроки C#. Наследование...
Урок 3. Делегаты и события. • Уроки C#. Делегаты и с...
Урок 2. Состав типа. • Уроки C#. Состав типа.
Урок 1. Типы данных. • Уроки C#. Типы данных.

КОМЕНТАРІ: 98
@gilman2056
@gilman2056 9 років тому
Единственное внятное объяснение интерфейсов, спасибо большое
@lllraytoxlll
@lllraytoxlll 3 роки тому
Единственное внятное видео по C#. Впервые с ходу понял всё без вчитывания в теорию на metanit-е (кстати там вообще всё плохо с интерфейсами, на мой взгляд). Были бы все уроки в таком же стиле.
@user-nc7zt9rj9e
@user-nc7zt9rj9e 4 роки тому
Присоединюсь ко всем коментам. Пока добрался до этого видео мозг выдавал фатальный эрор!!!!! читая и просматривая другие видео про интерфейс Очень внятное объяснение с первых же минут. Спасибо огромное.
@maxtreyd
@maxtreyd 3 роки тому
2021 - это по прежнему самый внятный урок по Интерфесу .От души благодарочка и лайк !
@pavelo9998
@pavelo9998 9 років тому
Крутое толкование! Здоровья тем кто записывал, вы молодцы !
@sfuid
@sfuid 4 роки тому
Автор ты шарпист от Бога. Спасибо за простые объяснения!
@hopexstudio6388
@hopexstudio6388 Рік тому
Привет из 2022 года, по-прежнему актуальный вопрос, спасибо за урок!
@vovaka440
@vovaka440 3 роки тому
Я потратил очень много времени, перечитав разные источники, как на русском, так и на английском, но нормального толквания я не нашел. И вот наткнулся на это видео и как-то прям на все мои вопросы сразу дались ответы и не заметил как быстро пробежали 24 минуты. Спасибо за труд!
@Maylilev
@Maylilev 8 місяців тому
Крутейшее объяснение для чего нужны интерфейсы
@darthmalak7951
@darthmalak7951 7 років тому
Лучшее что я видел/читал про интерфейсы.
@osipov180
@osipov180 9 років тому
Очень толковый урок! Спасибо.
@daryan3918
@daryan3918 6 років тому
Спасибо вам большое, особенно за последний блок объяснения про явную реализацию интерфейсов. Наконец-то стало понятно))
@tashadexter92
@tashadexter92 4 роки тому
Спасибо за материал, очень доступно!
@mykhailomorhal2181
@mykhailomorhal2181 5 років тому
Очень хорошие уроки.Много нового узнал)
@astoriuswho8250
@astoriuswho8250 9 років тому
Благодарю вас за качественное изложение материала.
@user-rb1jb7gk8g
@user-rb1jb7gk8g 6 років тому
Очень внятно и доступно. Спасибо Автору!
@GanovAlex
@GanovAlex 4 роки тому
Отличное объяснение все четко и понятно 👍
@tuzman91
@tuzman91 9 років тому
Отлично! Очень полезный и понятный урок. Спасибо :)
@lenaartemenko9240
@lenaartemenko9240 6 років тому
Офигенское объяснение!!!! СПАСИБО
@user-gn7vb2yv7j
@user-gn7vb2yv7j 8 років тому
Спасибо большое, хорошие уроки !
@another4629
@another4629 3 роки тому
И правда понятное объяснение. Спасибо.
@NatuNuarat
@NatuNuarat 8 років тому
Спасибо за урок, всё отлично понятно :)
@gorbulevsv
@gorbulevsv 8 років тому
Спасибо за простое и понятное объяснение. Читал как-то об этом в книге, но там была только явная реализация, и я подумал - а зачем нужны эти заморочки.
@user-et9qz1ke4g
@user-et9qz1ke4g 5 років тому
Самая лучшая подача материала которую я встречал
@the_djo
@the_djo 8 років тому
Одним словом "Костыль"! - Улыбнуло =)))) Спасибо за уроки!
@newyoutube7242
@newyoutube7242 7 років тому
Спасибо большое!Очень хороший урок!
@albertmakarov2249
@albertmakarov2249 5 років тому
Вот тут огромный лайкос, сразу видно, человек на своей шкуре почувствовал, сложность темы. Ясное и внятное объяснение
@DarthVader100500
@DarthVader100500 5 років тому
Большое спасибо!
@user-pd6fd1fe3e
@user-pd6fd1fe3e 9 років тому
Неплохо было бы в контексте этой темы затронуть тему абстрагирования(как еще одному базовому принципу ООПроектирования) и делегирования - это бы прояснило ситуацию с надобностью интерфейсов(в тех случаях когда встает вопрос - почему нужно использовать интерфейсы, а не, например, абстрактные классы). Интерфейсы - легкая и одновременно сложная тема для понимания. Главный ключ - Абстрагирование!
@daza3425
@daza3425 6 років тому
nakonezto ponjala etu temu ! spasibo !!
@SERG__ZV
@SERG__ZV 5 років тому
Классное видео, теперь я хоть примерно понял зачем эти интерфейсы нужны.
@andruf3310
@andruf3310 6 років тому
Ух ты.... Вот это круть!
@user-oj3kn4lv8t
@user-oj3kn4lv8t 3 роки тому
Очень хороший пример для объяснения смысла интерфейсов. До этого не понимал зачем они нужны, так как все примеры просто дублировали функциональность классов
@roduman
@roduman 5 років тому
КРАСАВЧЕГ - спасибо тебе. Только ты смог объяснить мне что это такое.
@KlenKlenov
@KlenKlenov 4 роки тому
Спасибо!
@user-ct8zg9vt9r
@user-ct8zg9vt9r 7 років тому
Спасибо за уроки. На 15 минуте в методе Build и Move указано имя переменной cost. Так и должно быть, или это опечатка? В move видимо должно было быть speed ?
@behaerkaev6492
@behaerkaev6492 3 роки тому
круто объяснил спасибо
@user-og5ew5bp9n
@user-og5ew5bp9n 3 роки тому
Урок прекрасный
@user-lt7cf5qq8j
@user-lt7cf5qq8j 5 років тому
Супер
@MaksUsanin
@MaksUsanin 7 років тому
пока я понял что за исключением событий и делегатов, и немного отличием синтаксиса если сравнивать с Java то один в один, но как раз таки события и делегаты могут вносить свой большой вклад в архитектуру приложения
@Defazze
@Defazze 10 років тому
Переменную какого типа мы будем передавать в метод Move, если просто реализуем в нужных классах GetSpeed()? Интерфейс - суть контракт между классом и компилятором. Однако интерфейсы можно использовать по разному. В частности, в следующем уроке интерфейсы используются для декорирования основного класса. Насчет "лучшего понимания кода" - не уверен, что интерфейсы можно для этого использовать.
@shurale85
@shurale85 7 років тому
Добрый день!Очень понравилось объяснение! Спасибо! Нет ли у вас в планах сделать урок на тему внедрения зависимостей?
@yuryyudanau2868
@yuryyudanau2868 6 років тому
Хотелось бы узнать, каким образом метод sort проверяет реализован ли интерфейс IComparable. И как вообще узнать реализован ли такой то интерфейс у класса.
@ivanprokhorov5951
@ivanprokhorov5951 10 років тому
Для чего создавать ещё и интерфейс, если можно просто реализовать в каждом классе метод GetSpeed()? Уточните пожалуйста: интерфейс - просто контракт между классом и компилятором, что первый реализует некий метод? Или интерфейсы нужны для лучшего понимания кода? Или всё таки есть более глубокий смысл использования интерфейсов?
@afk4268
@afk4268 5 років тому
Здравствуйте. Посоветуйте вменяемый интернет-задачник для С# типо codewars? Codewars не устраивает тем, что там задания написаны на английском и иногда их перевод занимает большое количество времени. Советы о том, что нужно подтянуть английский язык можете не писать :)
@mugen31337
@mugen31337 7 років тому
а как через Array отсортировать строковые типы?
@hello_world_zz
@hello_world_zz 4 роки тому
1:50 По моему , модификатор доступа у методов не зависит от модификатора доступа интерфейса. Он всегд public
@artemio150
@artemio150 10 років тому
Может что бы лучше понимать сенс сущностей стоит приводить какие-то моменты истории , они же не просто так возникают делегаты интерфейсы и тп. Потому что вот сложность как раз спроектировать. Всегда есть соблазн создать мусорку
@Defazze
@Defazze 10 років тому
См. урок 7, "Пример создания приложения".
@user-ux6kd2qc5y
@user-ux6kd2qc5y 2 роки тому
2022 крутое видео
@user-ql2ru4db2u
@user-ql2ru4db2u 8 років тому
Я самоучка, поэтому заранее извиняюсь за возможно наивный вопрос. Зачем вообще создавать одну лишь сигнатуру в интерфейсе ? Мы же в классах полностью прописываем тела методов. Что изменится, если мы вообще не будем создавать интерфейсы и просто напишем методы в классах ?
@qweqwe123qewweqwe
@qweqwe123qewweqwe 8 років тому
+Алексей Луняев, очень долго объяснять. Если вкраце - то ваш код более модульный, более поддерживаемый. Рекомендую почитать литературу по набору принципов SOLID. А также введение к книге Dependency injection in .NET - там хорошо объясняется, что такое слабая связность кода и почему это есть благо.
@user-og1ym9bm8f
@user-og1ym9bm8f 8 років тому
+Алексей Луняев одним из положительных моментов реализации интерфейсов также является то, что вы можете: - создавать коллекции экземпляров различных типов, которые реализуют конкретный интерфейс, и обращаться к каждому элементу методами этого интерфейса - также вы можете написать методы расширения для всех типов поддерживающих некий интерфейс, что также бывает очень удобно.
@Dialect6081
@Dialect6081 3 роки тому
В этом будет сложнее ориентироваться, интерфейсом же мы как бы подписываем контракт на то, что все его члены обязаны быть реализованны в классе, имплементирующем этот интерфейс. Другими словами, видя реализацию интерфейса в каком-то классе, мы знаем, какие поля и методы там гарантированно реализованы.
@artemio150
@artemio150 10 років тому
И вот такой ещё вопрос. По какому принципу можно быстро ориентироаться в дотнете? Вот у вас тут в примере при необходимости сортировки клас пронаследил фреймворк, могут быть и другие более сложные может быть варианты, когда есть понимание как релизовать там допустим туже сортировку, но в дотнете допустим это есть. Вот может есть способ не опускаясь до гугла мониторить возможности дотнета на нужный тебе предмет? Вот как к примеру вы обращаетесь к дизасемблеру, нечто в этом роде.
@Defazze
@Defazze 10 років тому
Зависит от того, в какой предметной области происходит работа. Например, если мы имеем дело с десктоп-приложением, значит, надо обязательно знать библиотеку System.Windows.Form и класс Control. Что касается общих вещей, то никогда не лишнем будет знание множеств (см. урок 9, "Множества"). И т. д. Ориентирование в дотнете всё равно приходит с практикой.
@thedyxxx
@thedyxxx 7 років тому
Сложилось впечатление, что интерфейсы это некая замена множественного наследования. Т.е. если в языке есть множественное наследование - то интерфейсы становятся не нужны?
@genadypisarev884
@genadypisarev884 9 років тому
Хорошие уроки . из всех что я смотрел . спасибо . единственная проблема что я совсем новичок в программировании .и еще более самоучка . с этим и связана моя проблема . пока я не пойму где это применять и еще более не напишу что нибудь используя одно или другое .то я наверное так и не пойму . например для чего нужны интерфейсы я понял . но вот статические и обстрактные методы классы ,и,т,д . я не пойму для чего вся эта волокита .ну есть конечно еще много чего что для меня кажется не понятным и бесмысленно применимым . например как сетер и гетер . для чего они нужны ? зачем их подставлять к переменным .? я этого не понимаю хоть и смотрел ваш урок .. когда в гетер пишешь какую-то логику то еще куда ни шло . ну например проверяем что-б число было не меньше ноль .. а писать просто string myString{set;get}; зачем это? ничего же не принимается и ничего не проверяется ?
@Saby1983x
@Saby1983x 9 років тому
genady pisarev Если еще не разобрался сам, то подмогну, авось еще кому поможет. >но вот статические и обстрактные методы классы ,и,т,д . я не пойму для чего вся эта волокита Статический класс в принципе не особо нужен, но допустим, глядя на класс 2DUtility я примерно пойму по названию для чего он нужен, и соответсвенно уменьшу названия части используемых функций - т.е. это синтаксический сахар по сути. Абстрактный класс - наследние от С++. Дело в том что С# в первой редакции разрабатывался через одно место, и там повсюду компромиссы. Так что эта "волокита" - следствие старых ошибок и концепций. >сетер и гетер . для чего они нужны? Это на самом деле пострясающая и исключительно нужная вещь. С их помощью ты можешь сохранять инвариант класса ))) То бишь - отсекать недопустимые действия, вызывать нужные, и т.д., в общем это крайне необходимая вещь. Есть даже такой "паттерн" - property - и используется он практически повсеместно. К примеру - в игре у тебя у перса здоровье опустилось меньше 0, и ты - вместо того чтобы отслеживать это во многих местах внутри игры, вешаешь делегат, который дергается когда здоровье становится равным/меньше нулю, и в сеттере проводишь все проверки, включая дергание делегата и т.п. В-общем используется в каждом практически проекте, большем пары десятков строк. >string myString{set;get}; У меня в той же vs по умолчанию так и подставляется. Лень стирать )
@user-xe3dj6bh6v
@user-xe3dj6bh6v 9 років тому
Как-то я не уловил. А почему у нас тип возвращаемого значения обджект - почему не стрин. Мы ведь строку возвращали в методах GetMenu(). Или обджект используется как общий класс для всего... 42...
@Defazze
@Defazze 9 років тому
Можно и string. В данном случае это совершенно непринципиально. На самом деле этот пример целиком взят из Рихтера )
@user-rt6km4mf3n
@user-rt6km4mf3n 8 років тому
А что значит "интерфейс ай компэрэбл должен быть реализован типом данных независимо от цепочки наследования"? Если используется наследник, то для сортировки его типа реализация ай компэрэбл в родительском классе (по каким-то общим полям) не сработает?
@Defazze
@Defazze 8 років тому
+Юрий Пискунов Пожалуйста, укажите тайминг, невозможно помнить наизусть все уроки ) Что касается вопроса - конечно же, если реализация ICOmparable есть в родительском классе, то наследник так же будет ее поддерживать.
@user-rt6km4mf3n
@user-rt6km4mf3n 8 років тому
+Программирование - это просто Конечно. Извиняюсь. 19:08
@Defazze
@Defazze 8 років тому
+Юрий Пискунов Честно говоря, уже не помню, почему я так сказал ) В любом случае, смотрите мой предыдущий ответ - он корректен.
@user-rt6km4mf3n
@user-rt6km4mf3n 8 років тому
+Программирование - это просто И ещё одно. А если ситуация, когда нужна последовательная сортировка элементов массива по разным полям. Сначала по возрасту, потом по оценкам...
@Defazze
@Defazze 8 років тому
+Юрий Пискунов тогда в случае равенства возрастов не надо возвращать 0 в методе CompareTo, а переходить к анализу следующего поля.
@ramzaysorge4435
@ramzaysorge4435 6 років тому
Добрый день. Вот в красивой и правильной схеме, объясните пожалуйста. Если нужно определить свойство, которое должно быть во всех шести объектах Cat, Dog, TransportShip,FightShep, StateHouse и Hotel. Например, свойство Name. У каждого объекта оно должно быть. Где его нужно определять? Создать интерфейс нельзя, поскольку интерфейс - именованный набор сигнатур методов. В базовых классах - стремно, потому что их может быть много и в одном из них можно забыть это сделать. Ну а в дочерних классах совсем не место.
@BastionKadabr
@BastionKadabr 6 років тому
в книге по которой учу - к примеру все фигуры идут от базового класса Shapes все сотрудники продажи Employee ну все правильно у каждой так сказать категории свой базовый абстрактный класс откуда и идут имена формы возраст бонусы и так далее просто потом например если собаку надо засунуть в дом это как бэ соединяется другим методом
@BastionKadabr
@BastionKadabr 6 років тому
на сколько я понимаю на схеме Speed и Producktion наверно делегаты те это отдельные файлы с методом и с помощью делегирования в Animal BaseShip и BaseHouse созданы их объекты которые уже распространяются на дочерние если бы я делал то лучше в каждом базовом определил бы отдельно хотя если еще куча базовых классов то можно и отдельно но на сколько я понимаю это уже свой стиль
@ramzaysorge4435
@ramzaysorge4435 6 років тому
SpeedObject и ProductionObject, в контексте урока, - интерфейсы. Оказывается, как я уже выяснил, в интерфейсах можно описывать не только методы, но и свойства. Следовательно, описать свойство Name нужно в SpeedObject и ProductionObject. В реализациях этих интерфейсов Animal, BaseShip и BaseHouse мы обязаны будем определить свойство Name, а уже во всех потомках использовать это свойство. Спасибо, что помогли разобраться.
@user-zd3qw7le5c
@user-zd3qw7le5c Рік тому
@@BastionKadabr скажите пожалста . . . что в вашей книге сказано по поводу того что висьюал студия в диаграмме классов не отображает связь между интерфейсом и классом, который его реализует - по примеру такого отображения как между абстракным классом и наследуемым его классом ?????
@user-zd3qw7le5c
@user-zd3qw7le5c Рік тому
@@BastionKadabr а VS это должна отображать ? . . . если да - то я буду искать причину . . .
@ReasonX3
@ReasonX3 10 років тому
Все же не совсем понятно как быть, если класс должен унаследовать два других класса, не меняя их реализации. Если наследовать интерфейсы, то в каждом классе, который их наследует нужно писать собственную реализацию, но тогда получается дублирования кода. Или же в подобных случаях внутри класса просто объявляют экземпляры классов, функционал которых он должен был унаследовать?
@Defazze
@Defazze 10 років тому
Как правило, каждый класс, который реализует интерфейс, осуществляет собственную реализацию этого интерфейса, поэтому дублирования кода не происходит. Если же в коде выявляются какие-то общие участки, их можно вынести во внешний статический класс (получится так называемый хелпер). Тему хелперов и методов расширения мы будем рассматривать в 10 или 11 уроке.
@ReasonX3
@ReasonX3 10 років тому
Defazze Спасибо за ответ и за Вашы труды! Жду новых уроков.
@nezajac
@nezajac 4 роки тому
Если интерфейс реализуют но пишут методы интерфейса с нуля, какой смысл вообще реализовывать тогда интерфейсы, нет варианта написать новый метод?
@user-xe3dj6bh6v
@user-xe3dj6bh6v 9 років тому
И с явной реализацией что-то не так. Мы убрали реализацию метода в классе, но мы не убрали его вызов в программе, поэтому компилятор и ругнулся. Вот убрал я вызов, оставил только методы интерфейса - всё скомпилировалось и сработало. Мы ведь не обязаны его вызывать - равно как и методы интерфейсов. То есть минус вроде и назван, но неочевидно в чём он заключается - у нас не Питон, есть типы, модификаторы доступа - всё разложено по полкам таким образом. Тут тоже - 2 разных метода, для разных интерфейсов - вроде ничего не запутывается... Может есть какой другой пример явной реализации?
@Defazze
@Defazze 9 років тому
Модификаторы доступа тут не при чем. Суть явной реализации интерфейса - методы, реализованные явно, могут быть вызваны только у экземпляра, тип которого является этим интерфейсом. А вот если тип экземпляра реализует интерфейс, то методы, реализованные явно, вызваны быть не могут. Пример: тип Array (любой массив) реализует интерфейс IList. В интерфейсе IList есть метод Add. Однако если мы создадим массив, метода Add в экземпляре мы не увидим. Потому что он реализован явно. Тем не менее мы можем вызвать метод Add, если приведем наш массив к IList. Правда, тут же напоремся на исключение )
@user-pd6fd1fe3e
@user-pd6fd1fe3e 9 років тому
habrahabr.ru/post/30444/ - ответ на главные вопросы по этой теме. там в комментах есть бородатый пример с квадратом и прямоугольником. Есть такие принципы ООПроектирования - S.O.L.I.D. В частности L - принцип подстановки Лисков - дает понимание когда нужно наследовать(расширять) классы, и углубляясь в тему, можно понять когда реализовывать интерфейсы, при якобы нужном наследовании. В некоторых языках(не C#) синтаксис говорит сам за себя: class Child extends(РАСШИРЯЕТ) ParentClass, но - class Child implements(РЕАЛИЗУЕТ) IComparable. Т.о. нужно всего лишь для начала запомнить - расширяет класс, но реализует интерфейс. :)
@user-pd6fd1fe3e
@user-pd6fd1fe3e 9 років тому
не реклама и не мой пост - нтересующимся немного прояснит ситуацию - habrahabr.ru/post/30444/ Рекомендую прочитать комментарии несколько раз подряд для полного понимания сути вопроса!!
@ffs_999
@ffs_999 9 років тому
а как же свойства в интерфейсе? :(
@ProninART89
@ProninART89 2 місяці тому
Объясняете вы хорошо, но все равно не понятно, зачем нужны интерфейсы, если все то же самое можно сделать без них. Я просто не понимаю в чем их смысл, если в них нельзя реализовывать логику работы каких-либо методов, как в классе например. Я уже 4 видео посмотрел на ютубе, но до сих пор не могу понять, для чего нужны интерфейсы.
@azayarniy
@azayarniy 8 років тому
На самом деле этот из разряда если ты уже все знаешь, то можешь еще раз послушать. Слишком много начитанного материала.
@MrXripper
@MrXripper 10 років тому
Тип возвращаемого значения не входит в сигнатуру метода.
@Defazze
@Defazze 10 років тому
Для перегруженных методов - не входит. Для интерфейсов и делегатов - входит. msdn.microsoft.com/ru-ru/library/ms173114.aspx
@MrXripper
@MrXripper 10 років тому
Извините - не дочитал :)
@Fakels2011
@Fakels2011 6 років тому
Какая-то темная эта тема с интерфейсами, про диграммы в начале урока можно былобы это все реализовать и без интерфейсов, без множественного наследования, и без класса мусорки.Не понятен толком смысл этих интерфейсов.
@user-yi3el3pf1l
@user-yi3el3pf1l 5 років тому
ukposts.info/have/v-deo/nqViZ5pojW1krGg.html тут объясняться более точно смысл интерфейса, я тоже думал что можно просто создавать abstract
@playmarket8605
@playmarket8605 3 роки тому
Короче весь смысл интерфейсов это обязывать класс чтобы, он имел определённый список методов.
@user-jk3jy2up5j
@user-jk3jy2up5j 3 роки тому
Нет
@yakovga
@yakovga 3 роки тому
Замечательный урок, спасибо!!
C# programming. Lesson 5. Sealed, static and abstract types
27:39
Программирование - это просто
Переглядів 48 тис.
C# programming. Lesson 14. Reflection
27:14
Программирование - это просто
Переглядів 42 тис.
The World's Fastest Cleaners
00:35
MrBeast
Переглядів 87 млн
C# programming. Lesson 7. Application creation example
45:38
Программирование - это просто
Переглядів 169 тис.
Интерфейсы на практике
7:34
ExtremeCode
Переглядів 175 тис.
WPF C# MVVM Sample Application
13:16
MpCodes
Переглядів 15 тис.
C# programming. Lesson 17. Entity Framework. Part 2
38:09
Программирование - это просто
Переглядів 42 тис.
C# programming. Lesson 9. Sets
39:11
Программирование - это просто
Переглядів 53 тис.
Изучение C# в одном видео уроке за час!
1:06:08
Гоша Дударь
Переглядів 862 тис.
C# programming. Lesson 13. LINQ introducion
42:33
Программирование - это просто
Переглядів 68 тис.
C# programming. Lesson 3. Delegates and Events.
21:13
Программирование - это просто
Переглядів 186 тис.
C# programming. Lesson 8. Generics
23:33
Программирование - это просто
Переглядів 48 тис.