клас яблоко:дерево, треснутьКого_нибудь{ треснуть(){треснуть Кин_Конга по голове}} интерфейс треснутьКогоНибудь{треснуть()} класс Кин_Конг:обезьяна, треснутьКого_нибудь{треснуть(){п...
Понял разницу в другом видео, здесь закрепил Если абстр класс это транспортное средство, то объект - это, например самолёт или танк или ментовский бобик, т.е объект ЯВЛЯЕТСЯ абстрактным классом, самолёт - это транспортное средство, и тд. А вот интерфейс это например то, что это транспортное средство МОЖЕТ делать - двигаться. Например лететь в Тайланд или везти тебя с мигалками, при чём второй вариант веселее и бесплатный. Т.е. самолёт реализовывает интерфейс и теперь он может двигаться, но он может и не делать этого, если это например памятник второй мировой. В таком случае он является самолётом, т.е объектом абстрактного класса транспортное средство, но может реализовывать другой интерфейс, например быть фоном для селфи
У абстрактных классов нет объектов. Такие классы только могут быть унаследованы другими классами, у которых уже могут быть объекты (самолет, танк, автобус, велосипед).
@@TheDron84 абстрактный класс нужен чтоб писать меньше кода. А интерфейс нужен чтоб наследники этих интерфейсов не выходили за рамки свойств. Интерфейсы это фильтры или сортировщики классов.
Может кто-то сильно удивится, но в C++ "ключевое" слово interface - синоним ключевого слова class. Ноги отсюда растут. И из COM. По сути интерфейс это возможность сделать множественное наследование на нескольких абстрактных классах, но обламывая возможность сломать себе ногу в нескольких местах при этом. Кстати такая же фигня есть в делфи, но там интерфейсы - удовольствие весьма сомнительное. Это было техническое различие. А есть еще различие по способу применения. Так вот - интерфейсы используются когда нужна слабая связанность компонентов системы, так как они не содержат релизации, когда нужно код распихать по различным независимым dll-кам (Привет COM). Абстрактные классы же просто используются при построении иерархий наследования как более базовые типы.
Все это необходимо объяснять в контексте паттернов, использующих данные конструкции языка. Чтобы у людей было понимание не только что это такое, а и когда и как это нужно правильно использовать.
Мммм,паттерны, давайте для простейшего калькулятора сделаем 10 фабрик классов, 30 наследований и + всё ещё организуем по паттернам,чтобы побольше производительности ушло в никуда. А не проще ли сделать все из головы? Не говноколить,а именно просто сделать так,как оно работает
@@mrlait5732 только вот говнокод и наличие паттернов никак не связаны. С паттерна и говняют ещё больше,ибо применяют их вслепую потому что так умный дядька сказал и получается overengeneered grabage code ,где для хелло ворлда создана целая фабрика с бойлерплейтом в подарок.
@@РоманСмородов-л2в Паттерны нужно пихать там где они нужны, без паттернов у вас получится гавно код. Либо несознательно все равно используете паттерн, просто никогда не знали, что такой паттерн существует.
Не обязательно методы, реализуемые интерфейсом должны быть публичны. Можно сделать internal интерфейс и реализовать его явно в публичном классе. Пример - Tuple : ITuple
На дворе 21 год и уже с появлением .net core 5 в интерфейсы так же можно закладывать базовую реализацию. Всем спасибо, ностальжи, видео не останется забытым!!
во-первых с дотнета 5, а во вторых эту дефолтную реализацию в абстрактном классе или интерфейсе нужно по-разному юзать. Короче, после добавления этих дефолтных реализаций интерфейс не стал аналогом абстрактного класса и эти дефолтные реализации в интерфейсах имеют определённую область применения
Вот я седня делал лаютоаторку по проге на c#, сначала хотел сделать интерфейс вместо абстрактрого класса, но интерфейс требовал переопределять свойста что нафиг не надо так что абстрактные классы актуальность не утратили
То есть интерфисы мы можем использовать для различных объектов ну как в примере : IMovable, машина, собака, кот... они все могу передвигаться! А abstract class используется точно для конкретнои цели, public abstract Vehicle - тока для авто ?
Если коротко то. Абстрактный класс - обычный класс от которого наследуются. А интерфейс - описание методов для множества независимых классов между собой.
Пока что понимание интерфейса такое что в интерфейсе мы пишем что есть Организация и она запрещенная, а в каждой реализации мы как бы клеймим метод и даем всем понять что эта организация запрещенная на территории определенной страны
Начиная с С# 8 с интерфейсами началась какая-то жопа. Теперь они зачем-то хранят в себе значения свойств. Нафига, не понятно. Зато баги полезли из-за дублирования одних и тех же свойств в классе и интерфейсе.
На самом деле это разные вещи для разных целей. Абстрактным классом конечно возможно заменить интерфейс, но делать этого не нужно, хотя бы по вот этим двум причинам: 1) Длина кода, зачем громоздить длинные конструкции из лишних ключевых слов abstract class A { abstract public void X(); } class B : A { override public void X(); } если можно написать лаконичнее interface A { void X(); } class B : A { public void X(); } 2) Абстрактный класс все же является объектом, и в IL реализуется его конструктор. И если в проекте используется длинное древо наследований, то это куча ненужных лишних перегрузок, что означает минимальную, но потерю производительности. В современных реалиях разницу оn нескольких лишних тактов процессора конечно вряд ли кто-то заметит (если вы конечно не создаете миллион объектов в секунду), но зачем нужно даже минимальное зло, если можно его избежать.
Нас учитель заставляет писать репозиторий (в наших сайта на asp mvc). Сначала мне это всё дико не нравилось, потому что было очень сложно и лишне, потому что можно просто всё делать через контекст (ентити фреймвёрк), но когда всё таки смерился с тем, что репозиторий нужен, та реализаиця, которую требовал учитель оказалас просто суперской)) Мы создаём абстрактный репозиторий, в котором указываем всё самое необходимое, а дальше уже в конкретных его реализациях нужно прописывать только конструктор, остальные методы наследуются. Ну и конечно это всё обернуть интерфейсами) Это я написал, что абстрактный класс всё таки нужен))
Я не сказал, что абстрактный класс не нужен. Разумеется нужен, только для других целей. Там же где можно использовать интерфейс, лучше использовать интерфейс.
один чёрт не понимаю смысла. Всё так сложно называется, а по факту интерфейсы это способ просто собрать в одном месте все методы которые нужно реализовать и отдать его прогеру пониже рангом что бы он юзал его и создавал методы по этому интерфейсу. А абстрактный классы это способ реализации разных задач одним методом для сокращения кода, но по факту это часто вызывает путаницу
А еще множественное наследование реализуется, через интерфейсы. Интерфейсы нужно юзать только тогда, когда ты понимаешь и представляешь всю архитектуру приложения целиком и она готова схематически, иначе можно только наговнокодить и юзать интерфейсы, только ради интерфейсов )
Все довольно просто. Интерфейс существует для указания какому либо классу дополнительных качеств. В том смысле что объект должен реализовать определенную логику (например "движение"). А также для сокрытия зависимости между классами. Просто так для реализации наследования интерфейс не нужен. Абстрактный класс - это скелет, в нем может содержаться определенная логика, в интерфейсе же ее быть не может. Абстрактный класс зачастую - это базис для реализации основных ООП принципов.
Анатолий Снеговский нет! Интерфейсы нужно юзать в двух случаях - чтобы выделить одинаковую функциональность в РАЗНОРОДНЫХ классах (это те классы, которые наследуются от разных родительских классов), то есть интерфейс используется как теговая структура, второй вариант использования - небольшая иерархия, не имеющую начальную реализацию
@@MacIn173, не совсем. От абстрактного класса другие классы наследуются, в то время как интерфейсы реализуются. В Java и C# можно наследоваться только от одного класса (даже если он абстрактный), в то время как интерфейсов реализовывать можно сколько угодно. А вот в C++ есть множественное наследование, поэтому там - да, интерфейс являются просто частным случаем абстрактного класса. Абстрактные классы, помимо полей, могут ещё содержать конструкторы, статические и приватные методы; интерфейсы всего этого лишены.
@@Mike19910711 "другие классы наследуются, в то время как интерфейсы реализуются." это всего-навсего терминологическая разница в данном конкретном случае. "Абстрактные классы, помимо полей, могут ещё содержать конструкторы, статические и приватные методы; " я же сказал выше "полностью абстрактный класс без полей". Полностью а. классом вполне можно эмулировать интерфейс, если его нет в языке, например.
@@MacIn173 "это всего-навсего терминологическая разница в данном конкретном случае" - нет. Ещё раз: в Java и C# можно наследоваться только от одного класса, даже если он абстрактный. Таким образом, наследоваться от двух и более абстрактных классов уже нельзя, а реализовать интерфейсов можно сколько угодно. В C++ - да, там интерфейсы и не нужны в принципе (по той причине, что поддерживается множественное наследование, можно просто наследоваться от нескольких абстрактных классов).
@@Mike19910711 "Таким образом, наследоваться от двух и более абстрактных классов уже нельзя" естественно, но это - частный случай. Возьмем другой частный случай: простое наследование, один интерфейс - разница только в терминологии.
NICOLAS_MOM_WEIGHT = POSITIVE_INFINITY
NICOLAS_PP_LONG = NEGATIVE_INFINITY
@@kemsekov6331 PP_LENGTH
@@khodis2002 NICOLAS_PP_LONG = true
Я тупой. Показывай на яблоках.
клас яблоко:дерево, треснутьКого_нибудь{
треснуть(){треснуть Кин_Конга по голове}}
интерфейс треснутьКогоНибудь{треснуть()}
класс Кин_Конг:обезьяна, треснутьКого_нибудь{треснуть(){п...
ruclips.net/video/8eZy5xiildM/видео.html
😂
Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?
Понял разницу в другом видео, здесь закрепил
Если абстр класс это транспортное средство, то объект - это, например самолёт или танк или ментовский бобик, т.е объект ЯВЛЯЕТСЯ абстрактным классом, самолёт - это транспортное средство, и тд. А вот интерфейс это например то, что это транспортное средство МОЖЕТ делать - двигаться. Например лететь в Тайланд или везти тебя с мигалками, при чём второй вариант веселее и бесплатный. Т.е. самолёт реализовывает интерфейс и теперь он может двигаться, но он может и не делать этого, если это например памятник второй мировой. В таком случае он является самолётом, т.е объектом абстрактного класса транспортное средство, но может реализовывать другой интерфейс, например быть фоном для селфи
У абстрактных классов нет объектов. Такие классы только могут быть унаследованы другими классами, у которых уже могут быть объекты (самолет, танк, автобус, велосипед).
@@TheDron84 абстрактный класс нужен чтоб писать меньше кода. А интерфейс нужен чтоб наследники этих интерфейсов не выходили за рамки свойств. Интерфейсы это фильтры или сортировщики классов.
шаблон для шаблонов.
А ещё абстрактный класс может иметь поля и конструкторы, в то время как интерфейс - нет.
Интерфейс - это набор контрактов, абстрактный класс - общение объектов
Может кто-то сильно удивится, но в C++ "ключевое" слово interface - синоним ключевого слова class. Ноги отсюда растут. И из COM. По сути интерфейс это возможность сделать множественное наследование на нескольких абстрактных классах, но обламывая возможность сломать себе ногу в нескольких местах при этом. Кстати такая же фигня есть в делфи, но там интерфейсы - удовольствие весьма сомнительное.
Это было техническое различие. А есть еще различие по способу применения. Так вот - интерфейсы используются когда нужна слабая связанность компонентов системы, так как они не содержат релизации, когда нужно код распихать по различным независимым dll-кам (Привет COM). Абстрактные классы же просто используются при построении иерархий наследования как более базовые типы.
Все это необходимо объяснять в контексте паттернов, использующих данные конструкции языка. Чтобы у людей было понимание не только что это такое, а и когда и как это нужно правильно использовать.
Мммм,паттерны, давайте для простейшего калькулятора сделаем 10 фабрик классов, 30 наследований и + всё ещё организуем по паттернам,чтобы побольше производительности ушло в никуда. А не проще ли сделать все из головы? Не говноколить,а именно просто сделать так,как оно работает
@@РоманСмородов-л2в и получить гавно код)
@@mrlait5732 только вот говнокод и наличие паттернов никак не связаны. С паттерна и говняют ещё больше,ибо применяют их вслепую потому что так умный дядька сказал и получается overengeneered grabage code ,где для хелло ворлда создана целая фабрика с бойлерплейтом в подарок.
@@РоманСмородов-л2в Паттерны нужно пихать там где они нужны, без паттернов у вас получится гавно код. Либо несознательно все равно используете паттерн, просто никогда не знали, что такой паттерн существует.
Не обязательно методы, реализуемые интерфейсом должны быть публичны. Можно сделать internal интерфейс и реализовать его явно в публичном классе. Пример - Tuple : ITuple
Если класс можно
в некотором смысле назвать абстракцией объекта, то interface можно
назвать абстракцией методов. K.O.
Чел все коротко ясно и доходчиво
Жалко что ваш дискорд сервер умер, эх, столько хороших воспоминаний с него, столько хороших людей..
Спасибо за пересказ статьи из метанита
Тупая ава
Очень приятные видео, спасибо за контент! :)
На дворе 21 год и уже с появлением .net core 5 в интерфейсы так же можно закладывать базовую реализацию. Всем спасибо, ностальжи, видео не останется забытым!!
во-первых с дотнета 5, а во вторых эту дефолтную реализацию в абстрактном классе или интерфейсе нужно по-разному юзать. Короче, после добавления этих дефолтных реализаций интерфейс не стал аналогом абстрактного класса и эти дефолтные реализации в интерфейсах имеют определённую область применения
Вот я седня делал лаютоаторку по проге на c#, сначала хотел сделать интерфейс вместо абстрактрого класса, но интерфейс требовал переопределять свойста что нафиг не надо так что абстрактные классы актуальность не утратили
Четко, даже Nicolas_mom поняла
То есть интерфисы мы можем использовать для различных объектов ну как в примере : IMovable, машина, собака, кот... они все могу передвигаться! А abstract class используется точно для конкретнои цели, public abstract Vehicle - тока для авто ?
да
ваще понятно. автор объяснил примерно на уровне: знак главная дорога желтый а стоп красный
Это именно то что я искал
Экстремально чётко!
Если коротко то. Абстрактный класс - обычный класс от которого наследуются.
А интерфейс - описание методов для множества независимых классов между собой.
@@odnonoguypirat не знаю о чём ты.
И абстрактный класс и интерфейсы в новой версии .Net могут иметь функцию по умолчанию.
как же сложно понять эту ересь без практики её использования. Сейчас немного прояснилось
очень поверхностно, этого не достаточно для понимания...
Пока что понимание интерфейса такое что в интерфейсе мы пишем что есть Организация и она запрещенная, а в каждой реализации мы как бы клеймим метод и даем всем понять что эта организация запрещенная на территории определенной страны
Где маты, собачки и маслята?) Не узнаю этот канал в молодости)
Спасибо. Мне понравилось
Автор совершенно не разбирается в теме, зачем снимать видео, если сам не углубился в вопрос? "Чухчухчух" говорит паровозик. Атписка.
@reаct Паравозик делает не только "Чухчухчух", там встречаются "Шуухшухшухшух", а также более редкие представители "Пибип" и "Пуууб"
Бедный Николас и его мама…
Начиная с С# 8 с интерфейсами началась какая-то жопа. Теперь они зачем-то хранят в себе значения свойств. Нафига, не понятно. Зато баги полезли из-за дублирования одних и тех же свойств в классе и интерфейсе.
На самом деле это разные вещи для разных целей. Абстрактным классом конечно возможно заменить интерфейс, но делать этого не нужно, хотя бы по вот этим двум причинам:
1) Длина кода, зачем громоздить длинные конструкции из лишних ключевых слов
abstract class A { abstract public void X(); }
class B : A { override public void X(); }
если можно написать лаконичнее
interface A { void X(); }
class B : A { public void X(); }
2) Абстрактный класс все же является объектом, и в IL реализуется его конструктор. И если в проекте используется длинное древо наследований, то это куча ненужных лишних перегрузок, что означает минимальную, но потерю производительности. В современных реалиях разницу оn нескольких лишних тактов процессора конечно вряд ли кто-то заметит (если вы конечно не создаете миллион объектов в секунду), но зачем нужно даже минимальное зло, если можно его избежать.
Нас учитель заставляет писать репозиторий (в наших сайта на asp mvc). Сначала мне это всё дико не нравилось, потому что было очень сложно и лишне, потому что можно просто всё делать через контекст (ентити фреймвёрк), но когда всё таки смерился с тем, что репозиторий нужен, та реализаиця, которую требовал учитель оказалас просто суперской)) Мы создаём абстрактный репозиторий, в котором указываем всё самое необходимое, а дальше уже в конкретных его реализациях нужно прописывать только конструктор, остальные методы наследуются. Ну и конечно это всё обернуть интерфейсами) Это я написал, что абстрактный класс всё таки нужен))
Я не сказал, что абстрактный класс не нужен. Разумеется нужен, только для других целей. Там же где можно использовать интерфейс, лучше использовать интерфейс.
нет, обоснование это то, что я не хочу тратить года на то, чтобы эта грамотность въелась мне в мозг, потому что есть делать поважнее
Вас и вправду двое что-ли? Я думал это шутка.
*Спс, пнл, збс :)*
Спасибо!!!
0:20 - Этот какнал ведут 2 чела?!!!!?!??!
вот это я откопал...
один чёрт не понимаю смысла. Всё так сложно называется, а по факту интерфейсы это способ просто собрать в одном месте все методы которые нужно реализовать и отдать его прогеру пониже рангом что бы он юзал его и создавал методы по этому интерфейсу. А абстрактный классы это способ реализации разных задач одним методом для сокращения кода, но по факту это часто вызывает путаницу
А еще множественное наследование реализуется, через интерфейсы. Интерфейсы нужно юзать только тогда, когда ты понимаешь и представляешь всю архитектуру приложения целиком и она готова схематически, иначе можно только наговнокодить и юзать интерфейсы, только ради интерфейсов )
Все довольно просто. Интерфейс существует для указания какому либо классу дополнительных качеств. В том смысле что объект должен реализовать определенную логику (например "движение"). А также для сокрытия зависимости между классами. Просто так для реализации наследования интерфейс не нужен.
Абстрактный класс - это скелет, в нем может содержаться определенная логика, в интерфейсе же ее быть не может. Абстрактный класс зачастую - это базис для реализации основных ООП принципов.
Анатолий Снеговский нет! Интерфейсы нужно юзать в двух случаях - чтобы выделить одинаковую функциональность в РАЗНОРОДНЫХ классах (это те классы, которые наследуются от разных родительских классов), то есть интерфейс используется как теговая структура, второй вариант использования - небольшая иерархия, не имеющую начальную реализацию
а кто такой Николай?
Второй ведущий на канале
Абстрактный класс может содержать реализации. Интерфейс - нет.
Полностью абстрактный класс без полей - тот же интерфейс.
@@MacIn173, не совсем. От абстрактного класса другие классы наследуются, в то время как интерфейсы реализуются. В Java и C# можно наследоваться только от одного класса (даже если он абстрактный), в то время как интерфейсов реализовывать можно сколько угодно. А вот в C++ есть множественное наследование, поэтому там - да, интерфейс являются просто частным случаем абстрактного класса. Абстрактные классы, помимо полей, могут ещё содержать конструкторы, статические и приватные методы; интерфейсы всего этого лишены.
@@Mike19910711 "другие классы наследуются, в то время как интерфейсы реализуются." это всего-навсего терминологическая разница в данном конкретном случае. "Абстрактные классы, помимо полей, могут ещё содержать конструкторы, статические и приватные методы; " я же сказал выше "полностью абстрактный класс без полей". Полностью а. классом вполне можно эмулировать интерфейс, если его нет в языке, например.
@@MacIn173 "это всего-навсего терминологическая разница в данном конкретном случае" - нет. Ещё раз: в Java и C# можно наследоваться только от одного класса, даже если он абстрактный. Таким образом, наследоваться от двух и более абстрактных классов уже нельзя, а реализовать интерфейсов можно сколько угодно. В C++ - да, там интерфейсы и не нужны в принципе (по той причине, что поддерживается множественное наследование, можно просто наследоваться от нескольких абстрактных классов).
@@Mike19910711 "Таким образом, наследоваться от двух и более абстрактных классов уже нельзя" естественно, но это - частный случай. Возьмем другой частный случай: простое наследование, один интерфейс - разница только в терминологии.
Да как ты смеешь?
Хотя, норм.
wat?
Нихрена не понял...