C# - Абстрактный класс vs Интерфейс

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

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

  • @КириллШепелев-х9и
    @КириллШепелев-х9и 7 лет назад +152

    NICOLAS_MOM_WEIGHT = POSITIVE_INFINITY

    • @kemsekov6331
      @kemsekov6331 4 года назад +13

      NICOLAS_PP_LONG = NEGATIVE_INFINITY

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

      @@kemsekov6331 PP_LENGTH

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

      @@khodis2002 NICOLAS_PP_LONG = true

  • @gydrazine
    @gydrazine 6 лет назад +178

    Я тупой. Показывай на яблоках.

    • @omoloni
      @omoloni 4 года назад +7

      клас яблоко:дерево, треснутьКого_нибудь{
      треснуть(){треснуть Кин_Конга по голове}}
      интерфейс треснутьКогоНибудь{треснуть()}
      класс Кин_Конг:обезьяна, треснутьКого_нибудь{треснуть(){п...

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

      ruclips.net/video/8eZy5xiildM/видео.html

    • @urfinjuss2639
      @urfinjuss2639 7 месяцев назад +1

      😂

  • @denisgavr199
    @denisgavr199 Год назад +2

    Братан, хорош, давай, давай, вперёд! Контент в кайф, можно ещё? Вообще красавчик! Можно вот этого вот почаще?

  • @danyloandreiev
    @danyloandreiev 7 лет назад +111

    Понял разницу в другом видео, здесь закрепил
    Если абстр класс это транспортное средство, то объект - это, например самолёт или танк или ментовский бобик, т.е объект ЯВЛЯЕТСЯ абстрактным классом, самолёт - это транспортное средство, и тд. А вот интерфейс это например то, что это транспортное средство МОЖЕТ делать - двигаться. Например лететь в Тайланд или везти тебя с мигалками, при чём второй вариант веселее и бесплатный. Т.е. самолёт реализовывает интерфейс и теперь он может двигаться, но он может и не делать этого, если это например памятник второй мировой. В таком случае он является самолётом, т.е объектом абстрактного класса транспортное средство, но может реализовывать другой интерфейс, например быть фоном для селфи

    • @TheDron84
      @TheDron84 6 лет назад +28

      У абстрактных классов нет объектов. Такие классы только могут быть унаследованы другими классами, у которых уже могут быть объекты (самолет, танк, автобус, велосипед).

    • @JohnDoe-pg6eh
      @JohnDoe-pg6eh 6 лет назад +16

      @@TheDron84 абстрактный класс нужен чтоб писать меньше кода. А интерфейс нужен чтоб наследники этих интерфейсов не выходили за рамки свойств. Интерфейсы это фильтры или сортировщики классов.

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

      шаблон для шаблонов.

    • @vasylnosovych4038
      @vasylnosovych4038 5 лет назад +2

      А ещё абстрактный класс может иметь поля и конструкторы, в то время как интерфейс - нет.

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

      Интерфейс - это набор контрактов, абстрактный класс - общение объектов

  • @jgkdmdevienjjgg8866
    @jgkdmdevienjjgg8866 7 лет назад +17

    Может кто-то сильно удивится, но в C++ "ключевое" слово interface - синоним ключевого слова class. Ноги отсюда растут. И из COM. По сути интерфейс это возможность сделать множественное наследование на нескольких абстрактных классах, но обламывая возможность сломать себе ногу в нескольких местах при этом. Кстати такая же фигня есть в делфи, но там интерфейсы - удовольствие весьма сомнительное.
    Это было техническое различие. А есть еще различие по способу применения. Так вот - интерфейсы используются когда нужна слабая связанность компонентов системы, так как они не содержат релизации, когда нужно код распихать по различным независимым dll-кам (Привет COM). Абстрактные классы же просто используются при построении иерархий наследования как более базовые типы.

  • @ppc2012
    @ppc2012 5 лет назад +18

    Все это необходимо объяснять в контексте паттернов, использующих данные конструкции языка. Чтобы у людей было понимание не только что это такое, а и когда и как это нужно правильно использовать.

    • @РоманСмородов-л2в
      @РоманСмородов-л2в 2 года назад +6

      Мммм,паттерны, давайте для простейшего калькулятора сделаем 10 фабрик классов, 30 наследований и + всё ещё организуем по паттернам,чтобы побольше производительности ушло в никуда. А не проще ли сделать все из головы? Не говноколить,а именно просто сделать так,как оно работает

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

      @@РоманСмородов-л2в и получить гавно код)

    • @РоманСмородов-л2в
      @РоманСмородов-л2в 2 года назад

      @@mrlait5732 только вот говнокод и наличие паттернов никак не связаны. С паттерна и говняют ещё больше,ибо применяют их вслепую потому что так умный дядька сказал и получается overengeneered grabage code ,где для хелло ворлда создана целая фабрика с бойлерплейтом в подарок.

    • @mrlait5732
      @mrlait5732 2 года назад +1

      @@РоманСмородов-л2в Паттерны нужно пихать там где они нужны, без паттернов у вас получится гавно код. Либо несознательно все равно используете паттерн, просто никогда не знали, что такой паттерн существует.

  • @jgkdmdevienjjgg8866
    @jgkdmdevienjjgg8866 7 лет назад +8

    Не обязательно методы, реализуемые интерфейсом должны быть публичны. Можно сделать internal интерфейс и реализовать его явно в публичном классе. Пример - Tuple : ITuple

  • @Skreepan
    @Skreepan 6 лет назад +29

    Если класс можно
    в некотором смысле назвать абстракцией объекта, то interface можно
    назвать абстракцией методов. K.O.

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

    Чел все коротко ясно и доходчиво

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

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

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

    Спасибо за пересказ статьи из метанита

  • @sergey51115
    @sergey51115 7 лет назад +4

    Очень приятные видео, спасибо за контент! :)

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

    На дворе 21 год и уже с появлением .net core 5 в интерфейсы так же можно закладывать базовую реализацию. Всем спасибо, ностальжи, видео не останется забытым!!

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

      во-первых с дотнета 5, а во вторых эту дефолтную реализацию в абстрактном классе или интерфейсе нужно по-разному юзать. Короче, после добавления этих дефолтных реализаций интерфейс не стал аналогом абстрактного класса и эти дефолтные реализации в интерфейсах имеют определённую область применения

    • @Ворвзаконе-г5у
      @Ворвзаконе-г5у 2 года назад +1

      Вот я седня делал лаютоаторку по проге на c#, сначала хотел сделать интерфейс вместо абстрактрого класса, но интерфейс требовал переопределять свойста что нафиг не надо так что абстрактные классы актуальность не утратили

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

    Четко, даже Nicolas_mom поняла

  • @IonWP
    @IonWP 7 лет назад +12

    То есть интерфисы мы можем использовать для различных объектов ну как в примере : IMovable, машина, собака, кот... они все могу передвигаться! А abstract class используется точно для конкретнои цели, public abstract Vehicle - тока для авто ?

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

    ваще понятно. автор объяснил примерно на уровне: знак главная дорога желтый а стоп красный

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

    Это именно то что я искал

  • @АлексейБуров-т7ц
    @АлексейБуров-т7ц 4 года назад +1

    Экстремально чётко!

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

    Если коротко то. Абстрактный класс - обычный класс от которого наследуются.
    А интерфейс - описание методов для множества независимых классов между собой.

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

      @@odnonoguypirat не знаю о чём ты.
      И абстрактный класс и интерфейсы в новой версии .Net могут иметь функцию по умолчанию.

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

    как же сложно понять эту ересь без практики её использования. Сейчас немного прояснилось

  • @andrewsed_uplisten2019
    @andrewsed_uplisten2019 3 года назад +3

    очень поверхностно, этого не достаточно для понимания...

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

    Пока что понимание интерфейса такое что в интерфейсе мы пишем что есть Организация и она запрещенная, а в каждой реализации мы как бы клеймим метод и даем всем понять что эта организация запрещенная на территории определенной страны

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

    Где маты, собачки и маслята?) Не узнаю этот канал в молодости)

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

    Спасибо. Мне понравилось

  • @evgeniyreshetov3026
    @evgeniyreshetov3026 4 года назад +17

    Автор совершенно не разбирается в теме, зачем снимать видео, если сам не углубился в вопрос? "Чухчухчух" говорит паровозик. Атписка.

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

      @reаct Паравозик делает не только "Чухчухчух", там встречаются "Шуухшухшухшух", а также более редкие представители "Пибип" и "Пуууб"

  • @МаксимТимошенко-у4у

    Бедный Николас и его мама…

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

    Начиная с С# 8 с интерфейсами началась какая-то жопа. Теперь они зачем-то хранят в себе значения свойств. Нафига, не понятно. Зато баги полезли из-за дублирования одних и тех же свойств в классе и интерфейсе.

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

    На самом деле это разные вещи для разных целей. Абстрактным классом конечно возможно заменить интерфейс, но делать этого не нужно, хотя бы по вот этим двум причинам:
    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 нескольких лишних тактов процессора конечно вряд ли кто-то заметит (если вы конечно не создаете миллион объектов в секунду), но зачем нужно даже минимальное зло, если можно его избежать.

    • @MartinEden-ps6ld
      @MartinEden-ps6ld 7 лет назад

      Нас учитель заставляет писать репозиторий (в наших сайта на asp mvc). Сначала мне это всё дико не нравилось, потому что было очень сложно и лишне, потому что можно просто всё делать через контекст (ентити фреймвёрк), но когда всё таки смерился с тем, что репозиторий нужен, та реализаиця, которую требовал учитель оказалас просто суперской)) Мы создаём абстрактный репозиторий, в котором указываем всё самое необходимое, а дальше уже в конкретных его реализациях нужно прописывать только конструктор, остальные методы наследуются. Ну и конечно это всё обернуть интерфейсами) Это я написал, что абстрактный класс всё таки нужен))

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

      Я не сказал, что абстрактный класс не нужен. Разумеется нужен, только для других целей. Там же где можно использовать интерфейс, лучше использовать интерфейс.

    • @MartinEden-ps6ld
      @MartinEden-ps6ld 7 лет назад +4

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

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

    Вас и вправду двое что-ли? Я думал это шутка.

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

    *Спс, пнл, збс :)*

  • @АнатолийВотТакВот
    @АнатолийВотТакВот 2 года назад

    Спасибо!!!

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

    0:20 - Этот какнал ведут 2 чела?!!!!?!??!

  • @daniil__kryuchkov
    @daniil__kryuchkov 9 месяцев назад

    вот это я откопал...

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

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

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

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

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

      Все довольно просто. Интерфейс существует для указания какому либо классу дополнительных качеств. В том смысле что объект должен реализовать определенную логику (например "движение"). А также для сокрытия зависимости между классами. Просто так для реализации наследования интерфейс не нужен.
      Абстрактный класс - это скелет, в нем может содержаться определенная логика, в интерфейсе же ее быть не может. Абстрактный класс зачастую - это базис для реализации основных ООП принципов.

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

      Анатолий Снеговский нет! Интерфейсы нужно юзать в двух случаях - чтобы выделить одинаковую функциональность в РАЗНОРОДНЫХ классах (это те классы, которые наследуются от разных родительских классов), то есть интерфейс используется как теговая структура, второй вариант использования - небольшая иерархия, не имеющую начальную реализацию

  • @linker-arm
    @linker-arm 7 месяцев назад

    а кто такой Николай?

    • @Wate-b4u
      @Wate-b4u 6 месяцев назад +1

      Второй ведущий на канале

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

    Абстрактный класс может содержать реализации. Интерфейс - нет.

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

      Полностью абстрактный класс без полей - тот же интерфейс.

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

      ​@@MacIn173​, не совсем. От абстрактного класса другие классы наследуются, в то время как интерфейсы реализуются. В Java и C# можно наследоваться только от одного класса (даже если он абстрактный), в то время как интерфейсов реализовывать можно сколько угодно. А вот в C++ есть множественное наследование, поэтому там - да, интерфейс являются просто частным случаем абстрактного класса. Абстрактные классы, помимо полей, могут ещё содержать конструкторы, статические и приватные методы; интерфейсы всего этого лишены.

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

      @@Mike19910711 "другие классы наследуются, в то время как интерфейсы реализуются." это всего-навсего терминологическая разница в данном конкретном случае. "Абстрактные классы, помимо полей, могут ещё содержать конструкторы, статические и приватные методы; " я же сказал выше "полностью абстрактный класс без полей". Полностью а. классом вполне можно эмулировать интерфейс, если его нет в языке, например.

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

      @@MacIn173 "это всего-навсего терминологическая разница в данном конкретном случае" - нет. Ещё раз: в Java и C# можно наследоваться только от одного класса, даже если он абстрактный. Таким образом, наследоваться от двух и более абстрактных классов уже нельзя, а реализовать интерфейсов можно сколько угодно. В C++ - да, там интерфейсы и не нужны в принципе (по той причине, что поддерживается множественное наследование, можно просто наследоваться от нескольких абстрактных классов).

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

      @@Mike19910711 "Таким образом, наследоваться от двух и более абстрактных классов уже нельзя" естественно, но это - частный случай. Возьмем другой частный случай: простое наследование, один интерфейс - разница только в терминологии.

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

    Да как ты смеешь?
    Хотя, норм.

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

    wat?

  • @desys.
    @desys. 3 года назад

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