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

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


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

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

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

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

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

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

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

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


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

Вы смотрите срез комментариев. Показать все
34
Автор поста оценил этот комментарий
Странно. Более корректный пример - ручка которая может писать синим, а может красным цветом, например. Один интерфейс - множество реализаций, епта. Или я не прав?
раскрыть ветку (15)
12
Автор поста оценил этот комментарий
Неа, тут наследование от абстрактной ручки с бесцветными чернилами.
раскрыть ветку (13)
10
Автор поста оценил этот комментарий
Эм ну да. Есть абстрактная ручка с методом "писать". Наследуясь от нее получаем красную ручку в которой тот же самый метод "писать" реализован с помощью красных чернил. Полиморфизм? Полиморфизм.
раскрыть ветку (12)
4
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий
Так ведь не у каждой ручки можно заменить стержень, чтобы она писала другим цветом. Плюс, абстрактной ручкой все равно писать не выйдет. А еще есть перьевые ручки и многоцветные, где тоже просто так изменением переменной не обойдешься.

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

Либо можно использовать композицию из ручки и объекта чернил в ней. Заменяя чернила другой реализацией интерфейса "чернила" можно писать разными цветами.

Автор поста оценил этот комментарий
Писать можно одним цветом только.
раскрыть ветку (8)
11
DELETED
Автор поста оценил этот комментарий
Вообще полиморфизм бывает двух типов. Первый выражается в едином интерфейсе, но разной реализации (виртуальные методы и наследование в терминах С++). Второй тип - это единый семантический смысл, но с разным интерфейсом (перегрузка функций).
раскрыть ветку (7)
5
Автор поста оценил этот комментарий

Вообще причем тут цвет ручки? Это обычная переменная типа Color.


Почему? Потому что цвет ручки это не действие (метод).

Это так же как и скорость объекта. Вы же не будете делать абстрактные классы под каждое float-значение скорости? Или все же будете? :D

раскрыть ветку (2)
1
Автор поста оценил этот комментарий
Тут вопрос не здравого смысла
DELETED
Автор поста оценил этот комментарий

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

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

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

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

Для людей без фундаментального оборазования рекомендую начать с википедии, можно даже русской, там нормально написано https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC...


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

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

Тем, кому это не надо - ничего не поймут даже с твоих слов. Легче сказать, что одно и тоже действие, допустим писать, может быть выполнено/реализовано по разному: левой рукой, правой, печатными или строчными литерами.
А про контракт им задвигать как бы и не надо, они не поймут, к тому же это только касательно интерфейсов. Нельзя назвать контрактом статический полиморфизм в плюсах, просто есть реализация другая и все

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

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


Я это к тому, что сначала нужно просто выучить какой-нибудь ЯП, так сказать пощупать программирование, чтобы потом, когда тебе говорят "контракт" ты понимал, что имеется ввиду в терминах одного или другого языка. Программируем мы не на языка, а с его помощью. Но предлагать людям читать общие термины, без подготовки - это как ребенку 7-ми лет дать книжку по математическому анализа за 3-й курс универа.

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