Абстрактный класс в ООП
ฝัง
- เผยแพร่เมื่อ 13 ส.ค. 2015
- Вы не можете создать объекты абстрактного класса. И когда вы впервые это слышите, может быть не совсем ясно, зачем-же вообщетакой класс нам может понадобиться.
К счастью понять это весьма несложно, и вы разберётесь в этом посмотрев это видео.
Спасибо, действительно очень доходчиво.
Владимир, спасибо вам большое за эту замечательную передачу! Смотрю по вечерам после работы, вы для меня как Малахов для русских бабушек
мне 50 и я смотрю по вечерам Владимира, не надо обобщать за русских бабушек))
@@user-kr7hf8bo2l ещё не бабушка)
не думал, что когда-нибудь буду смотреть уроки в Иисуса, уроки чёткие. спасибо!
Хиппи-программист
Все просто и на человеческом. Спасибо большущие вам за вашу работу. Не как не мог вникнуть но после видео про Ранее и Позднее и этот ролик все стало на свои места !!!
Очень хорошее объяснение. Особенно учитывая что я работал на мебельном производстве, и данный пример, просто лучший способ объяснить мне абстрактный класс. Спасибо за урок!
Обнимаю крепко крепко и благодарю от всей души!
Спасибо за доходчивое объяснение, даже такой чайник как я понял. Лайк и подписку оформил)))
Спасибо большое, понятно и доступно. Кстати, ваш сайт не работает, хотел зайти, посмотреть переводы статей.
Спасибо!
Идеальная подача, спасибо за актуальную тему
Посмотрев первый раз, я ничего не понял, пошёл посмотрел другой урок, где наглядно показывают абстрактный класс, вернулся сюда и все абсолютно стало понятно) благодарю за урок.
Огромное человеческое спасибо! Видео реально разложило по полкам в моем мозгу многие вещи!. А я не мог понять, почему, заходя в родительский класс я вижу кучу пустых методов…
2:22 на этом моменте у моего мозга переполнился стек вызовов и мозг ушёл в BSOD
Володя, спасибо за видео! было бы здорово узнать ваше мнение по поводу того, когда лучше использовать класс, а когда интерфейс.
гибридное программирование с примесью кириллицы - огонь :D
Проходил курсы в интернете от одного из спикеров, рассказывалось вкратце как создать. Владимир, ты рассказал мега подробно и понятно, чего не хватало в моем курсею Спасибо! Продолжай!)
Лайк + подписка + уведомления)
Спасибо
Очень хорошо и понятно обьяснили, спасибо вам большое
про мебель гениальный пример
Опс вот это прикольное "подавание" материала ! спс
Спасибо, Бро, очень доходчиво , очень живая подача!
Пример с мебелью супер!
огромное спасибо.
Просто спасибо
Супер!Лайк і підписка!
харисматично объясняет, лучше других подобных видео
Спасибо.
агонь
👍
Расскажите об абстрактных классах при реализации views в MVC проектах. Желателен конкретный пример. Спасибо.
В Джаве для этого есть удобное ключевое abstract. Как по мне, это более читабельно, чем =0 в конце метода. Этим словом нужно помечать и сам абстрактный, а абстрактный метод, который он содержится. Несколько неудобно, конечно, что нужно это слово писать и там, и там, чтобы иметь в классе абстрактные методы, но что есть, то есть; плюс это опять-таки повышает читабельность кода.
спасибо
Володя, а можете рассказать про метаклассы, которые есть в C++ Builder, Delphi. Как их использовать ?
хм, билдер ещё жив?!
@@maxlich9139 Неа. Некроманты, мать их ;)
Я в восторге. Правда. Да, сильно разжевано. Но больше не нужно ничего читать или смотреть по данной теме. Аплодирую
Why should we use abstract classes if we have protocols? I'm an iOS developer.
9:40 "хочет человек сделать". Допустим у меня сайт по сборке мебели, онлайн (сборка виртуальных макетов) и пользователь решил собрать себе макет шкафа, а это значит он создаст класс "шкаф" у которого будет родительский класс "мебель" который создан мною со своими методами. Я правильно понял?
Если брать описанный вами пример, то это больше понятие интерфейса. Абстрактный класс как таковой, все же имеет при себе реализацию каких-то методов, которые используются либо вызываются и перекрываются.
TheNimmortal Про интерфейс видео скоро тоже будет. У интерфейса не может быть данных.
У абстрактного класса могут быть какие-то реализованые методы, но это не обязательно. В некоторых языках есть разница между интерфейсом и абстрактным классом без методов и данных. Java например.
Да, просто мой профиль как раз таки Java. Это автоматически вышло =) Просто если брать С++, то из-за отсутствия на уровне языка интерфейсов - проблема. Банальный пример - ромбовидное наследование("даймонд").
TheNimmortal Вот кстати и Интерфейс выложил: th-cam.com/video/cGCLDYqH7Pw/w-d-xo.html
Теперь я понимаю.
Володя, а если нет необходимости переопределять методы, а просто нужно добавить поля у наследникой. К примеру, у мебели может быть "вес" и "материал", а у стула "тип сидушки".
*наследников
Алексей Словягин Это простое наследование, в нём вы всегда можете добавлять дополнительные поля. При наследовании от абстрактного класса поля можно добавлять если нужно, а можно оставить как есть.
Учтите, что на многих языках поля делают приватными/защищёнными, так что вам всё равно придётся создавать методы доступа.
Для пишущих на питоне:
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
Экспериментируйте.
можно ли связать абстрактный класс и форму?
Думаю уже поздно,нет нельзя.
У абстрактного класса не существует объекты которые можно передать в головную функцию (int main)
Но от абстрактного класса идут наследники мебель и стул ,если модификатор доступа в них public , то объекты дочернего класса могут существовать в int main.
2:23 нет, никогда не видел.
У меня был следующий случай в жизни.
Я дал грузчикам ключи от квартиры, в которой стояли столы и стулья, и попросил их вынести всю мебель из неё. А когда грузчики закончили свою работу, я обнаружил, что в квартире больше нет ни столов, ни стульев.
Вопрос: как грузчики поняли, что нужно вынести столы и стулья из квартиры, хотя я им об этом не говорил?
Ну самое-то очевидное и не сказали - абстрактный класс нужен прежде всего для того, чтобы избежать дублирования кода.
Можно подробнее, каким образом абстрактный класс помогает избежать дублирование кода?
Посмотрел в первый раз ничего не понял. Посмотрел через год программирования, хоть и функциональщиной - понял
что такое почти университет?
Не говорите только про C++. Рассазывайте про все языки!
Тот кто знает что такое наследование, тому очень типа нужны абстрактные классы. а почему не унаследоваться от обычного класса? зачем абсирактный тогда? просто обычный класс написал и от него наследуйся.
Да, но в таком случае, класс "B", который наследует обычный класс "A" не будет обязан переопределять абстрактные методы класса "A". Если класс "А" абстрактный (с абстрактными методами), то он заставляет иметь методы (помеченные у него как абстрактные) в наследующих его классах.
Смысл в том, что Вы написали очень полезный класс (абстрактный) и его должны наследовать другие классы, но в нём есть методы, которые нужно ОБЯЗАТЕЛЬНО использовать в дочерних классах или переопределять их по своему. Но совершенно точно, они вынуждены в своих дочерних классах эти методы описывать, пусть даже по своему.
Я все равно не понял, зачем нужен абстрактные класс и методы. Методы классов выполняют какую-то полезную работу - создают стул, стол. Методы абстрактного класса - просто родители не создающие ничего. Насколько я понимаю, в этом есть какая-то польза? Какая?
Как мне кажется, это позволяет реализовать в языке такой принцип ООП, как абстракция. То есть идёт работа с абстрактыми понятиями. По сути, это некоторое обобщение. Вообще, абстрактный класс можно понимать как некую категорию. Поэтому в функции может ожидаться объект, принадлежащий какой-то категории (это удобно, когда реализация неважна, и когда все объекты этой категории обладают какие-то важными общими свойствами или обладают каким-то важным общим поведением; например в игре можно объявить абстрактный класс "активный объект", который может допустим ходить, атаковать, иметь хп и урон, а потом уже унаследовать от него класс игрока и классы его противников; это довольно удобная абстрактизация)
Дам пример для всех, кто не понимает зачем декларировать пустую функцию.
Допустим, у вас есть класс A.
Вы наследуете от него класс B и создаете в нём функцию foo().
Затем на указатель на обьект типа A выделяете функцию B (например, еслив программе таблица хранит элементы A и B в одном массиве)
A* obj = new B;
Теперь программа будет работать с объектом B как с объектом A:
вызываем obj.foo() - ошибка, класс A не содержит функцию foo. Придется использовать приведение типов с помощью dynamic_cast.
А можно просто в классе A объявить пустую виртуальную функцию, теперь компилятор знает, что она есть, но при этом она не занимает память.
Теперь obj.foo() вызывает foo() класса B.
Для того чтоб классы наследники обязательно реализовали все методы и свойства абстрактного класса. Это Ася кухня для того чтоб когда кодят несколько гигов одновременно главный чувак задаёт правила для других которые реализуют дочерним классы.
Не чувак слишком абстрактное объяснение. Давай переделывай. Ясности не внес.
Ну такое. . .