Абстрактный класс в ООП

แชร์
ฝัง
  • เผยแพร่เมื่อ 13 ส.ค. 2015
  • Вы не можете создать объекты абстрактного класса. И когда вы впервые это слышите, может быть не совсем ясно, зачем-же вообщетакой класс нам может понадобиться.
    К счастью понять это весьма несложно, и вы разберётесь в этом посмотрев это видео.

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

  • @JSvift
    @JSvift 3 หลายเดือนก่อน

    Спасибо, действительно очень доходчиво.

  • @user-ug8qc6tr6b
    @user-ug8qc6tr6b 8 ปีที่แล้ว +36

    Владимир, спасибо вам большое за эту замечательную передачу! Смотрю по вечерам после работы, вы для меня как Малахов для русских бабушек

    • @user-kr7hf8bo2l
      @user-kr7hf8bo2l 2 ปีที่แล้ว +1

      мне 50 и я смотрю по вечерам Владимира, не надо обобщать за русских бабушек))

    • @Ogilouk
      @Ogilouk 11 หลายเดือนก่อน

      @@user-kr7hf8bo2l ещё не бабушка)

  • @victor-zz6xn
    @victor-zz6xn 4 ปีที่แล้ว +14

    не думал, что когда-нибудь буду смотреть уроки в Иисуса, уроки чёткие. спасибо!

    • @RS-nj2dv
      @RS-nj2dv 4 ปีที่แล้ว

      Хиппи-программист

  • @ziyadseykhanov3967
    @ziyadseykhanov3967 5 ปีที่แล้ว +5

    Все просто и на человеческом. Спасибо большущие вам за вашу работу. Не как не мог вникнуть но после видео про Ранее и Позднее и этот ролик все стало на свои места !!!

  • @pavelsewerow1448
    @pavelsewerow1448 8 ปีที่แล้ว +7

    Очень хорошее объяснение. Особенно учитывая что я работал на мебельном производстве, и данный пример, просто лучший способ объяснить мне абстрактный класс. Спасибо за урок!

  • @user-ek9ez7ho6f
    @user-ek9ez7ho6f 4 ปีที่แล้ว

    Обнимаю крепко крепко и благодарю от всей души!

  • @coreytaylor3418
    @coreytaylor3418 6 ปีที่แล้ว +3

    Спасибо за доходчивое объяснение, даже такой чайник как я понял. Лайк и подписку оформил)))

  • @EvgenichTalagaev
    @EvgenichTalagaev 8 หลายเดือนก่อน +1

    Спасибо большое, понятно и доступно. Кстати, ваш сайт не работает, хотел зайти, посмотреть переводы статей.

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

    Спасибо!

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

    Идеальная подача, спасибо за актуальную тему

  • @darul-asar381
    @darul-asar381 2 ปีที่แล้ว

    Посмотрев первый раз, я ничего не понял, пошёл посмотрел другой урок, где наглядно показывают абстрактный класс, вернулся сюда и все абсолютно стало понятно) благодарю за урок.

  • @user-bs6ey5iu2t
    @user-bs6ey5iu2t ปีที่แล้ว

    Огромное человеческое спасибо! Видео реально разложило по полкам в моем мозгу многие вещи!. А я не мог понять, почему, заходя в родительский класс я вижу кучу пустых методов…

  • @404Negative
    @404Negative 5 ปีที่แล้ว +10

    2:22 на этом моменте у моего мозга переполнился стек вызовов и мозг ушёл в BSOD

  • @constantinekhvalin6038
    @constantinekhvalin6038 8 ปีที่แล้ว

    Володя, спасибо за видео! было бы здорово узнать ваше мнение по поводу того, когда лучше использовать класс, а когда интерфейс.

  • @yarobest9594
    @yarobest9594 4 ปีที่แล้ว +5

    гибридное программирование с примесью кириллицы - огонь :D

  • @user-bw9eu4ln1i
    @user-bw9eu4ln1i 2 ปีที่แล้ว

    Проходил курсы в интернете от одного из спикеров, рассказывалось вкратце как создать. Владимир, ты рассказал мега подробно и понятно, чего не хватало в моем курсею Спасибо! Продолжай!)

    • @user-bw9eu4ln1i
      @user-bw9eu4ln1i 2 ปีที่แล้ว

      Лайк + подписка + уведомления)

  • @SashaGalashka
    @SashaGalashka 5 หลายเดือนก่อน

    Спасибо

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

    Очень хорошо и понятно обьяснили, спасибо вам большое

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

    про мебель гениальный пример

  • @JaanPajusalu
    @JaanPajusalu 7 ปีที่แล้ว

    Опс вот это прикольное "подавание" материала ! спс

  • @mightyv726
    @mightyv726 7 ปีที่แล้ว

    Спасибо, Бро, очень доходчиво , очень живая подача!

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

    Пример с мебелью супер!

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

    огромное спасибо.

  • @user-kj8yk8it6d
    @user-kj8yk8it6d 3 ปีที่แล้ว

    Просто спасибо

  • @FrenkyDev
    @FrenkyDev 8 ปีที่แล้ว

    Супер!Лайк і підписка!

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

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

  • @user-kv5ze5qc2b
    @user-kv5ze5qc2b 3 ปีที่แล้ว

    Спасибо.

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

    агонь

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

    👍

  • @baron2272
    @baron2272 6 หลายเดือนก่อน

    Расскажите об абстрактных классах при реализации views в MVC проектах. Желателен конкретный пример. Спасибо.

  • @maxlich9139
    @maxlich9139 6 ปีที่แล้ว

    В Джаве для этого есть удобное ключевое abstract. Как по мне, это более читабельно, чем =0 в конце метода. Этим словом нужно помечать и сам абстрактный, а абстрактный метод, который он содержится. Несколько неудобно, конечно, что нужно это слово писать и там, и там, чтобы иметь в классе абстрактные методы, но что есть, то есть; плюс это опять-таки повышает читабельность кода.

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

    спасибо

  • @russia_who_am_I
    @russia_who_am_I 7 ปีที่แล้ว

    Володя, а можете рассказать про метаклассы, которые есть в C++ Builder, Delphi. Как их использовать ?

    • @maxlich9139
      @maxlich9139 6 ปีที่แล้ว

      хм, билдер ещё жив?!

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

      @@maxlich9139 Неа. Некроманты, мать их ;)

  • @fodcsafafgsdg
    @fodcsafafgsdg 5 ปีที่แล้ว

    Я в восторге. Правда. Да, сильно разжевано. Но больше не нужно ничего читать или смотреть по данной теме. Аплодирую

  • @user-yd9xy3rb4x
    @user-yd9xy3rb4x 2 ปีที่แล้ว

    Why should we use abstract classes if we have protocols? I'm an iOS developer.

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

    9:40 "хочет человек сделать". Допустим у меня сайт по сборке мебели, онлайн (сборка виртуальных макетов) и пользователь решил собрать себе макет шкафа, а это значит он создаст класс "шкаф" у которого будет родительский класс "мебель" который создан мною со своими методами. Я правильно понял?

  • @TheNimmortal
    @TheNimmortal 8 ปีที่แล้ว

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

    • @VladimirMozhenkov
      @VladimirMozhenkov  8 ปีที่แล้ว +1

      TheNimmortal Про интерфейс видео скоро тоже будет. У интерфейса не может быть данных.
      У абстрактного класса могут быть какие-то реализованые методы, но это не обязательно. В некоторых языках есть разница между интерфейсом и абстрактным классом без методов и данных. Java например.

    • @TheNimmortal
      @TheNimmortal 8 ปีที่แล้ว

      Да, просто мой профиль как раз таки Java. Это автоматически вышло =) Просто если брать С++, то из-за отсутствия на уровне языка интерфейсов - проблема. Банальный пример - ромбовидное наследование("даймонд").

    • @VladimirMozhenkov
      @VladimirMozhenkov  8 ปีที่แล้ว

      TheNimmortal Вот кстати и Интерфейс выложил: th-cam.com/video/cGCLDYqH7Pw/w-d-xo.html

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

    Теперь я понимаю.

  • @user-nk8db9bb5k
    @user-nk8db9bb5k 8 ปีที่แล้ว

    Володя, а если нет необходимости переопределять методы, а просто нужно добавить поля у наследникой. К примеру, у мебели может быть "вес" и "материал", а у стула "тип сидушки".

    • @user-nk8db9bb5k
      @user-nk8db9bb5k 8 ปีที่แล้ว

      *наследников

    • @VladimirMozhenkov
      @VladimirMozhenkov  8 ปีที่แล้ว +1

      Алексей Словягин Это простое наследование, в нём вы всегда можете добавлять дополнительные поля. При наследовании от абстрактного класса поля можно добавлять если нужно, а можно оставить как есть.
      Учтите, что на многих языках поля делают приватными/защищёнными, так что вам всё равно придётся создавать методы доступа.

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

    Для пишущих на питоне:
    1. Чтобы класс являлся абстрактным, он должен наследовать специальный класc ABC (из пакета "abc") и содержать хотя бы один абстрактный метод (декоратор @abstractmethod - также подключается из пакета "abc"). Это два условия.
    2. Абстрактный класс можно только наследовать из другого класса, его нельзя присвоить объекту, как другие классы. MyClass(MyAbstractClass): # ОК. MyClass наследует MyAbstractClass. Всё в порядке.
    my_obj = MyAbstractClass() # не ОК! my_obj не может быть экземпляром абстрактного класса MyAbstractClass. Так нельзя.
    3. Все методы определённые в абстрактном классе, как абстрактные методы (декоратор @abstractmethod) обязательно должны быть определены в его дочерних классах. Обязательно!
    4. Абстрактный класс может содержать другие методы, а не только методы помеченные как @abstractmethod.
    Пример:
    # Обязательно подключаем
    from abc import ABC, abstractmethod
    # Описываем абстрактный класс. Наследует спец класс "ABC" и имеет методы @abstractmethod
    class MyAbstractClass(ABC):
    @abstractmethod
    def must_have_first(self):
    print("must_have_first from MyAbstractClass")
    @abstractmethod
    def must_have_second(self):
    print("must_have_second from MyAbstractClass")
    def say_hello():
    print("Hello from MyAbstractClass")
    #my_obj = MyAbstractClass() # Нельзя! Только наследовать!
    # Это обычный класс наследующий абстрактный класс.
    class MyClass(MyAbstractClass):
    # Обязаны переопределить этот метод - у абстрактного класса он есть!
    def must_have_first(self):
    print('must_have_first from MyClass')

    # Обязаны переопределить этот метод - у абстрактного класса он есть!
    def must_have_second(self):
    print('must_have_second from MyClass')
    def say_hi(self):
    print("Say hi from MyClass")
    # Пробуем
    my_obj = MyClass()
    my_obj.must_have_first()
    my_obj.must_have_second()
    my_obj.say_hi()
    MyAbstractClass.say_hello()
    Выведет:
    must_have_first from MyClass
    must_have_second from MyClass
    Say hi from MyClass
    Hello from MyAbstractClass
    Экспериментируйте.

  • @user-yg4ih9jp9i
    @user-yg4ih9jp9i 7 ปีที่แล้ว

    можно ли связать абстрактный класс и форму?

    • @Roman-ms5fw
      @Roman-ms5fw 7 ปีที่แล้ว

      Думаю уже поздно,нет нельзя.
      У абстрактного класса не существует объекты которые можно передать в головную функцию (int main)
      Но от абстрактного класса идут наследники мебель и стул ,если модификатор доступа в них public , то объекты дочернего класса могут существовать в int main.

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

    2:23 нет, никогда не видел.
    У меня был следующий случай в жизни.
    Я дал грузчикам ключи от квартиры, в которой стояли столы и стулья, и попросил их вынести всю мебель из неё. А когда грузчики закончили свою работу, я обнаружил, что в квартире больше нет ни столов, ни стульев.
    Вопрос: как грузчики поняли, что нужно вынести столы и стулья из квартиры, хотя я им об этом не говорил?

  • @gordonfreeman1842
    @gordonfreeman1842 5 ปีที่แล้ว +1

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

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

      Можно подробнее, каким образом абстрактный класс помогает избежать дублирование кода?

  • @sergeyab9468
    @sergeyab9468 5 ปีที่แล้ว +1

    Посмотрел в первый раз ничего не понял. Посмотрел через год программирования, хоть и функциональщиной - понял

  • @user-md5yb8hz4h
    @user-md5yb8hz4h 7 ปีที่แล้ว +1

    что такое почти университет?

  • @Ivan-qb7kc
    @Ivan-qb7kc 6 ปีที่แล้ว

    Не говорите только про C++. Рассазывайте про все языки!

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

    Тот кто знает что такое наследование, тому очень типа нужны абстрактные классы. а почему не унаследоваться от обычного класса? зачем абсирактный тогда? просто обычный класс написал и от него наследуйся.

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

      Да, но в таком случае, класс "B", который наследует обычный класс "A" не будет обязан переопределять абстрактные методы класса "A". Если класс "А" абстрактный (с абстрактными методами), то он заставляет иметь методы (помеченные у него как абстрактные) в наследующих его классах.
      Смысл в том, что Вы написали очень полезный класс (абстрактный) и его должны наследовать другие классы, но в нём есть методы, которые нужно ОБЯЗАТЕЛЬНО использовать в дочерних классах или переопределять их по своему. Но совершенно точно, они вынуждены в своих дочерних классах эти методы описывать, пусть даже по своему.

  • @user-db2th5em3v
    @user-db2th5em3v 6 ปีที่แล้ว

    Я все равно не понял, зачем нужен абстрактные класс и методы. Методы классов выполняют какую-то полезную работу - создают стул, стол. Методы абстрактного класса - просто родители не создающие ничего. Насколько я понимаю, в этом есть какая-то польза? Какая?

    • @maxlich9139
      @maxlich9139 6 ปีที่แล้ว

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

    • @user-cf5sd6sy7g
      @user-cf5sd6sy7g 6 ปีที่แล้ว +1

      Дам пример для всех, кто не понимает зачем декларировать пустую функцию.
      Допустим, у вас есть класс A.
      Вы наследуете от него класс B и создаете в нём функцию foo().
      Затем на указатель на обьект типа A выделяете функцию B (например, еслив программе таблица хранит элементы A и B в одном массиве)
      A* obj = new B;
      Теперь программа будет работать с объектом B как с объектом A:
      вызываем obj.foo() - ошибка, класс A не содержит функцию foo. Придется использовать приведение типов с помощью dynamic_cast.
      А можно просто в классе A объявить пустую виртуальную функцию, теперь компилятор знает, что она есть, но при этом она не занимает память.
      Теперь obj.foo() вызывает foo() класса B.

    • @watchsee1812
      @watchsee1812 5 ปีที่แล้ว

      Для того чтоб классы наследники обязательно реализовали все методы и свойства абстрактного класса. Это Ася кухня для того чтоб когда кодят несколько гигов одновременно главный чувак задаёт правила для других которые реализуют дочерним классы.

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

    Не чувак слишком абстрактное объяснение. Давай переделывай. Ясности не внес.

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

    Ну такое. . .