Объяснил на пальцах

Однажды мы проводили собеседование с программистом C#. Наш рекрутер попросил кандидата объяснить принцип объектно-ориентированного программирования простым и понятным языком. Кандидат рассказывает, доходит до принципа полиморфизма и приводит пример: «Вот у меня есть ручка. Я могу ей написать свое имя, а могу воткнуть ее вам в глаз. Это и есть принцип полиморфизма».


P.S. Собеседование кандидат прошел успешно.

Офисные будни

5.1K поста16.2K подписчиков

Добавить пост

Правила сообщества

-не нарушайте вежливость. За нарушение вежливости -бан, ибо это отталкивает посетителей и авторов.

- не нарушайте правила Pikabu и чтите закон.

- добавляйте посты связанные с тематикой сообщества;
-делитесь опытом организации жизни  в офисе и проживания на работе;
-делитесь управленческим опытом;


Бан за неуместную настойчивость: если вы активно, по несколько раз в неделю, в течение длительного времени размещаете сообщения низкого качества, простецкие и незамысловатые, не ориентированные на интересы аудитории, вы отправляетесь в бан сообщества. Ради качества контента.

Вы смотрите срез комментариев. Показать все
203
Автор поста оценил этот комментарий
Весьма странное объяснение полиморфизмп. Я представил некую сущность в виде ручки, с 2мя методами - написать и воткнуть. Более корректноо имхо было бы сказать что я могу сделать это ручкой, а могу карандашом, так ккк они оба унаследованы от некой общей сущности.
раскрыть ветку (55)
10
Автор поста оценил этот комментарий

Поэтому, я и не особо люблю собеседования - каждый третий понимает ООП по-своему.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Не, тут скорее особенности реализации )
50
Автор поста оценил этот комментарий
Скорее 1 метод - "использовать" и две реализации, хотя я бы скорее Стратегию заюзал: пока догонишь того в кого воткнуть, пока воткнешь - куча лишних зависимостей для обычного письма.
раскрыть ветку (47)
36
Автор поста оценил этот комментарий

Две абстрактные сущности, одна - оружие, другая - пишущая пренадлежность. И ручка, унаследованная от обеих сущностей.

раскрыть ветку (44)
18
Автор поста оценил этот комментарий

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

раскрыть ветку (26)
13
Автор поста оценил этот комментарий
Можно от нескольких интерфейсов. Например, ручка будет реализовывать IWeapon и IWritingItem
раскрыть ветку (5)
10
Автор поста оценил этот комментарий

Не совсем корректно, класс - наследуют, интерфейс - реализуют... Поэтому все же множественного наследования нету =D

раскрыть ветку (3)
5
Автор поста оценил этот комментарий
Учитывая, что ручка изначально является пишущим предметом, но при этом её можно использовать как оружие, то можно наследоваться от WritingItem и реализовывать IWeapon
раскрыть ветку (1)
Автор поста оценил этот комментарий

во вы углубились я аж нить потерял

Автор поста оценил этот комментарий

Ещё можно примеси использовать и позабыть о наследовании и реализации интерфейсов.

use AttackTrait, WriteTrait;


Но об этом уже в совсем другом языке...

Автор поста оценил этот комментарий

Блин, точно, совсем забыл про интерфейсы. Каюсь.

1
Автор поста оценил этот комментарий
К слову о множественном наследовании: привык работать с Groovy (так-то вышло, что я с Java хуже обращаюсь, чем с Groovy в итоге :( ), где есть traits, плюс Scala изучаю, где они тоже есть, дивлюсь, как удобно множественное наследование с их помощью, а тут еще и Java 8 default реализацию ввели, но меня всё мучает вопрос: а за каким хером тогда в доброй части популярных классических ООП языков наследование лишь одиночное? Есть ли в этом какой-то реальный смысл, который traits и default нарушают или это с самого начала было едва ли обоснованное решение?
раскрыть ветку (2)
1
Автор поста оценил этот комментарий
а за каким хером тогда в доброй части популярных классических ООП языков наследование лишь одиночное?

Практически везде, где прямое множественное наследование классов запрещено, оно присутствует в изменённом виде: с помощью механизма интерфейсов или примесей (включение traits всё-таки не то же самое, что наследование от класса), так что нет причин сокрушаться :)


Есть ли в этом какой-то реальный смысл, который traits и default нарушают или это с самого начала было едва ли обоснованное решение?

Вот что на счёт проблем множественного наследования говорит Википедия:

- семантическая неопределенность часто совокупно представляется как Проблема ромба.

- отсутствует возможность непосредственного многократного наследования от одного класса. (подобная задумка может показаться каким-то отстоем, но разобрана, например, здесь: https://habrahabr.ru/sandbox/41142/)

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


Сам я с этим всем встречал только в лице интерфейсов в C#, о traits знаю лишь поверхностно, но едва ли они что-то нарушают, напротив, интерфейсы вот, например, не имеют конструкторов, что решает третью проблему из списка.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Спасибо за ответ, изучу глубже этот вопрос, дали пищу для размышлений :)

2
Автор поста оценил этот комментарий

Тяжело быть шарпами 8(

раскрыть ветку (16)
3
Автор поста оценил этот комментарий
Угу, ну тогда уж тяжело быть джаверами, дельфистами, пхпшниками... и еще много других языков, где нет множественного наследования классов
раскрыть ветку (14)
3
Автор поста оценил этот комментарий

добро пожаловать в Java8 с default методами =)

конечно, формально, это implements, но мы то знаем …

раскрыть ветку (5)
Автор поста оценил этот комментарий

Есть выход проще и лаконичнее - Scala.

раскрыть ветку (4)
Автор поста оценил этот комментарий

фии, ещё котлин сюда приплетите )

раскрыть ветку (3)
Автор поста оценил этот комментарий

Почему фи? В Scala отлично реализована функциональная часть и учтены недостатки Java (взять хотя бы Option). С Котлином пока не знаком.

раскрыть ветку (2)
Автор поста оценил этот комментарий

ну так почитайте, что там в Java8 появилось ;)

раскрыть ветку (1)
Автор поста оценил этот комментарий

Почему тяжело быть дельфистом?

раскрыть ветку (7)
14
Автор поста оценил этот комментарий
Потому что тяжело быть копрофилом
раскрыть ветку (6)
5
Автор поста оценил этот комментарий
Скорее уж геронтофилом тогда
раскрыть ветку (4)
3
Автор поста оценил этот комментарий

А чем не угодила Делфи? В чем по Вашему у нее такие значительные недостатки? Перефразирую: чего такого на ней нельзя реализовать, что позволяют другие языки и среды разработки? Вот недавно вышел "Берлин", постоянные апдейты. Если бы среда была невостребована, Эмбаркадеро ее не купила бы и не вкладывала бешеные деньги и ресурсы на ее дальнейшую разработку, продвижение и поддержку.

раскрыть ветку (2)
Автор поста оценил этот комментарий

Это хороший язык, я сам с него начинал, когда ещё только учился. Но на текущий момент он прилично так устарел.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Слишком оптимистично
Автор поста оценил этот комментарий
Но если язык прост и прекрасно справляется со своими задачами, то зачем от него уходить?
2
Автор поста оценил этот комментарий

шарпами быть проще

3
Автор поста оценил этот комментарий

Почему "оружие"? Это интерфейс - "втыкаемое" или "колющее".

раскрыть ветку (16)
1
Автор поста оценил этот комментарий

Потому что абстракиця.

раскрыть ветку (15)
2
Автор поста оценил этот комментарий
Какая-то абстрактная абстракция, любой предмет может быть оружием, но не у всех назначение убивать. По такой логике, если у нас есть солдат, то мы можем вооружить его ручкой и банкой с огурцами, потому что оружие. Бред.
раскрыть ветку (14)
Автор поста оценил этот комментарий

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

раскрыть ветку (13)
5
Автор поста оценил этот комментарий
Иллюстрация к комментарию
Автор поста оценил этот комментарий

Убивает в данном случае не действие предмета, а его форма (или просто факт его существования).

раскрыть ветку (11)
3
Автор поста оценил этот комментарий

Но с точке зрения программирования, логичнее объединять всё, что может быть использовано в качестве оружия, в один абстрактный класс "оружие", а не в десять разных классов "колющее", "режущее", "дробящее" и т.д. И абстрактный метод "нанести урон", в котором уже и определять, колешь ты им, или режешь.

раскрыть ветку (8)
3
Автор поста оценил этот комментарий

Вот как так!? На парах препод всякую х-ню непонятную загонял, которую ещё и перечитать раз 5 надо, чтоб понять, а тут всё так легко и просто!

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Потому что у него практики не было. Мы тут в офисах то и дело используем предметы совсем по разному и убивем друг друга

1
Автор поста оценил этот комментарий

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

раскрыть ветку (5)
1
Автор поста оценил этот комментарий

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

Задаёшь проверку, есть ли у тебя что-нибудь с интерфейсом "оружие", и если есть


оружие.Атаковать();


А у ручки:

паблик войд Атаковать() {
  ткнуть ручкой в глаз;
}
раскрыть ветку (4)
1
Автор поста оценил этот комментарий
1. Увидел предмет
2. Узнал что он существует
3. Умер
4. ???
5. :(
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Так бывает если найти нло, агент Малдер.
Автор поста оценил этот комментарий

если есть 2 разных типа и у них есть метод воткнуть, но втыкают их по разному - это специальный полиморфизм, а если втыкают одинаково, но разные типы объектов - это параметрический полиморфизм

раскрыть ветку (1)
Автор поста оценил этот комментарий
я вас почитал и перестал думать...
3
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (1)
3
Автор поста оценил этот комментарий

По-моему, он угрожал.

И, по-моему, угроза подействовала.

3
DELETED
Автор поста оценил этот комментарий
Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Не... полиморфизм это скорее как "вот ручка, она может писать и чернилами и кровью".

1
Автор поста оценил этот комментарий

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку