LINUX.ORG.RU

Полиморфизм? - Можно кормить Зайку мясом?

 


0

3

Какие принципы ООП вы знаете?

Их четыре:
▫️наследование;
▫️инкапсуляция;
▫️полиморфизм;
▫️абстракция.

🔹Наследование
Наследование позволяет новому классу наследовать атрибуты и методы уже существующего класса. Новый класс называется производным (дочерним). Существующий — базовым (родительским).

🔹Инкапсуляция
Этот принцип заключается в ограничении доступа к внутренним методам и переменным класса извне. В Python принцип реализован лишь на уровне соглашений: приватные атрибуты выделяются подчёркиванием — одинарным _ или двойным __. Эти подчёркивания сигнализируют другим программистам о приватности. Однако доступ к ним всё равно можно получить. 

🔹Полиморфизм
Полиморфизм позволяет использовать одну функцию для разных форм (типов данных). В Python это проявляется, например, когда дочерний класс переопределяет методы родительского класса или когда разные классы имеют методы с одинаковыми именами, но собственной реализацией.

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

#вопросы_с_собеседований

Наследование - всё ясно. Из одного Зайки - можно сделать второго. Гораздо большего размера с разным цветом глаз - Свойства

Инкапсуляция - Зайку резать нельзя. Можно кормить - вход. Убирать дерьмо - выход. Зайка может прыгать - Методы.

Полиморфизм? - Можно кормить Зайку мясом? Или можно «прикрутить» к нему крылья?

Абстракция? - Зайка и Крокодил могут прыгать вместе? - Используя одно и тоже Свойство?

Перемещено leave из general



Последнее исправление: sokolov (всего исправлений: 1)

Можно кормить Зайку мясом?

Полиморфизм?

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

Абстракция?

Процесс принятия пищи в абстрактном классе жЫвотное и есть абстракция, а классы волк и заяц конкретные реализации.

Ygor ★★★★★
()

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

anonymous
()

Ученые задокументировали, что зайцы едят мясо еще в 1921 году, но эти сообщения были эпизодическими полевыми отчетами, и это первый раз, когда мясоедение было снято на камеру,

bigbit ★★★★★
()

абстракция

В википедии добавили и все сразу начали как дудки повторять :D

Дяди и тёти а

  • наследование
  • инкапсуляция
  • полиморфизм

Это что не абстракция? Код в целом абстракиция, а её уровень зависит от частного случая или всё влоб (ой тогда это не ООП?) или фабрика на фабрике фабрикой по сокету делегирует в очередь….

Это как

Что такое Варёный картофель? 
Это картофель и овощ.
Какой овощ?
Картофель!
...
Ну да, картфель это овощ, но ты же уже сказал картофель
И?
И зачем тогда, добавлять "овощ"?
Ну картофель же овощ?
Да.
Но ты сказал что "и овощ"
И что?
Зачем?
Ну варёный картофель это варёный овощ
Да
Значит варёный картофель это когда варёный картофель овощ
Но картофель и так всегда овощ
...
Чегобл....иднй 

Или я дурак или тут под словом «Абстракция» понимается что угодно, но не то что оно означает напрямую.

LINUX-ORG-RU ★★★★★
()

Наследование

Позволяет расширить функционал без копипасты. + Композиция/декомпозиция.

приватные атрибуты выделяются подчёркиванием — одинарным _ или двойным __

В коде используется только одинарное _ и то лишь в тех методах, вызов которых может что-то поломать.

За __ скрывается магия:

>>> class Foo:
...    __bar = 42


>>> Foo()._Foo__bar
42

Не нужно использовать.

Полиморфизм

Не. Это крестовые шаблоны. Но если шире брать, то оно скорее про метапрограммирование.

Абстракция

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

Инкапсуляция - Зайку резать нельзя. Можно кормить - вход. Убирать дерьмо - выход. Зайка может прыгать - Методы.

Тут скорее для того чтобы зайка погадил нужно вызвать метод срать(), а всякие методы типа расслабить_очко() и выдавливать_шарики() не должны вызываться вне контекста сранья, например, при плавании в бассейне или на свидании с зайчихой во время страстного поцелуя…

Полиморфизм? - Можно кормить Зайку мясом? Или можно «прикрутить» к нему крылья?

Нет.

Абстракция? - Зайка и Крокодил могут прыгать вместе? - Используя одно и тоже Свойство?

Тут скорее есть общее понимание что такое автомобиль: у него должен быть кузов, двери, руль, минимум 4 колеса, и ты исходя из этих представлений проектируешь свой автомобиль… Замысел в том чтобы при попытке создать автомобиль на ходулях, язык тебя наказывал


Забей на эту дрисню. Все эти материалы/курсы пишут соевые додики, которые только закончили шарагу без реального опыта программирования, но с башкой забитой теорией. Они бы еще в хацкель все это дерьмо засунуть попытались… или в ЛИШП.

rtxtxtrx ★★
()
Ответ на: комментарий от Ygor

Java эффективное программирование Джошуа Блох

У меня так PHP умер… от того что из него сделали Java. Пусть лучше пишет на Java чем блохов в питон тянет

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от wandrien

Я конечно дуб в ООП, но что такое «абстрактные интерфейсы» и какие интерфейсы внезапно не абстрактные. И почему «абстрактные интерфейсы» не могут быть выражены через «иерархию классов»

Как по мне тавтология какая-то. Может я сейчас проявляю лютую невежественность. Но это ладно. Важно только то что я недопёр, допри за меня :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от FishHook

я думаю, под словом «абстракция» люди чаще всего имеют в виду противоположное «реализации»

поток сознания

Абстракция (Философская энциклопедия) (от лат. abstractio — отвлечение), — один из моментов процесса познания, который заключается в мысленном отвлечении от ряда несущественных свойств, связей изучаемого предмета и выделении основных, общих его свойств, связей и отношений.
rtxtxtrx ★★
()

Наследование - всё ясно. Из одного Зайки - можно сделать второго. Гораздо большего размера с разным цветом глаз - Свойства

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

Инкапсуляция - Зайку резать нельзя. Можно кормить - вход. Убирать дерьмо - выход. Зайка может прыгать - Методы.

Инкапсуляцие это сокрытие реализации. То есть, ты вызываешь метод Заяц.Жрат(морковка), вметсо жёваная_морковка = Заяц.Жеват(морковка); Заяц.содержимое_желудка += жёваная_морковка; [...]

Абстракция? - Зайка и Крокодил могут прыгать вместе? - Используя одно и тоже Свойство?

Абстракция — это понятие, применимое не только к ООП, а в целом к программированию. Даже самое простое императивное программирование на C — это абстракция над конкретными машинными инструкциями. Простыми словами, это когда ты можешь оперировать сущностями более высокого порядка, не вдаваясь в детали реализации.

Вроде банальность и очевидность, но я заметил, что новички не всегда осознают, что когда говорят «язык высокого уровня» или «низкого уровня», или даже относительно «выше уровнем», речь идёт именно об уровне абстракции, а не о чём-то ещё. Просто слово «абстракции» обычно опускают. От этого не до всех сразу доходит, что это не нечто отвлечённое, и не какие-то специальные «уровни»

Вообще абстракция во многом достигается инкапсуляцией как раз.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Это когда:

class Заяц
   implements Четвероногое,
              Млекопитающее,
              Теплокровное
{
   ....
}

И нам абсолютно посрать, чем является Заяц что в буквальном смысле, что в смысле is_a. Главное, что он реализует поведение согласно предоставленному интерфейсу.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 2)
Ответ на: комментарий от wandrien

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

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от flant

Потому что у автора не из реальной жизни а какая-то чушь.

И при всём это он заявляет что он программист со стажем.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Но это само собой, то чем является объект определяют его методы. Добавил стулу метод летать и он полетел.

Это утверждение верно в случае duck typing или в случае систем типов, в которых мы можем вывести тип из наличия методов с заданной сигнатурой, но – не в общем случае.

В случае объектных моделей, используемых в Java, в COM или в GObject, это приобретает форму:

Стул implements Летающее

Мебель *какая_то_мебель = ...;
Летающее *летающая_мебель = cast(какая_то_мебель, Летающее);
if (летающая_мебель)
   летающая_мебель->полетели();
else
   raise Exception("Объект не поддерживает интерфейс Летающее");
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 2)
Ответ на: комментарий от sokolov

А есть простенький пример где?

Нас учили на создании оконного интерфейса. Есть абстрактный Object, у него метод Paint. От Object наследуются Button, Window, CheckBox, Edit и т.п. Объявляем список Object, заполняем его нашими элементами интерфейса, и, вызывая для каждого Paint - рисуем интерфейс, т.к. каждый конкретный Paint рисует что-то своё.

tiinn ★★★★★
()
Ответ на: комментарий от wandrien

Абстракция — это понятие, применимое не только к ООП, а в целом к программированию. Даже самое простое императивное программирование на C — это абстракция над конкретными машинными инструкциями. Простыми словами, это когда ты можешь оперировать сущностями более высокого порядка, не вдаваясь в детали реализации.

Когда мы переходим к летающим стульям, смысл скрывается за горизонтом… а таки ж летающие стулья в программировании случаются. Поэтому, искать конкретный смысл - не всегда правильно. Бывает, правильнее назвать ЭТО Object, ибо описание простыми словами, что такое Object - занимает целый абзац, с мелким текстом, со * в конце.

tiinn ★★★★★
()
Ответ на: комментарий от tiinn

Бывает, правильнее назвать ЭТО Object, ибо описание простыми словами, что такое Object - занимает целый абзац, с мелким текстом, со * в конце.

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

wandrien ★★
()
Ответ на: комментарий от rtxtxtrx

Забей на эту дрисню. Все эти материалы/курсы пишут соевые додики, которые только закончили шарагу без реального опыта программирования, но с башкой забитой теорией. Они бы еще в хацкель все это дерьмо засунуть попытались… или в ЛИШП.

Согласен с вами на 100 процентов. Но люди пишут про это. - Значит нужно хотя бы понимать - что это мне не нужно.

sokolov
() автор топика
Ответ на: комментарий от sokolov

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

tiinn ★★★★★
()
Последнее исправление: tiinn (всего исправлений: 1)
Ответ на: комментарий от wandrien

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

Т.е. интерфейсы - вопрос удобства?

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

tiinn ★★★★★
()
Ответ на: комментарий от tiinn

Т.е. интерфейсы - вопрос удобства?

Всё, что уровнем выше машинного кода – это вопрос удобства.

Однако мы применительно к методикам проектирования рассматриваем такие виды удобства, когда количество переходит в качество.

Интерфейсы – это классификация способов взаимодействия единиц, составляющих систему.

wandrien ★★
()
Ответ на: комментарий от wandrien

Нет логической связи между названием класса Object и названием метода Paint.

Что значит нет? Логическая связь определяется кодом, а не какими-то диванными представлениями. Если Object может Paint значит может. Это аксиома данной конкретной системы.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Связь определяется смыслом. Код – это средство выражения смысла.

Это аксиома данной конкретной системы.

Да, давайте проектировать херовые объектные модели, а потом жаловаться, что ООП говно.

wandrien ★★
()
Ответ на: комментарий от wandrien

Интерфейсы – это классификация способов взаимодействия единиц, составляющих систему.

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

tiinn ★★★★★
()
Ответ на: комментарий от wandrien

Связь определяется смыслом. Код – это средство выражения смысла.

Правильно. Поэтому смысл такой, как записано в коде. А не такой как ты себе фантазируешь, что может быть, а что не может.

херовые объектные модели

Это другой вопрос.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от tiinn

множественное наследование напрямую в жизни - разрешено

Так в жизни оно связано только с интерфейсами. Проблема множественного наследования в ООП связана с данными.

no-such-file ★★★★★
()
Ответ на: комментарий от CrX

не всегда осознают, что когда говорят «язык высокого уровня» или «низкого уровня», или даже относительно «выше уровнем», речь идёт именно об уровне абстракции, а не о чём-то ещё

Меня так девушка в универе бросила. Спросила «ты ведь будешь программистом высокого уровня?», а я ответил «нет, низкого». Ну потому что сишка там, железо… но было уже поздно объяснять.

spbzip
()