Полиморфизм это…

По роду деятельности я часто (хотел написать постоянно, но уже нет…) провожу собеседования. Кроме вопросов по технологиям конечно интересны базовые понятия отрасли… Удивительно, но народ часто-густо не может сказать, что такое алгоритм, программа. Зачем они нужны… ООП вообще тёмный лес. Апофигеозм собеседования всегда является вопрос “ну и что такое полиморфизм?”

Короче мало кто говорит… а так хочется, чтоб кто-то ответил: “полиморфизм это когда ракеты в нелётную погоду разворачиваются домой, свиньи требуют оружия, собаки умеют маршировать, кенгуру шмаляют из ПЗРК, а NPC на уровне приходится прописывать как танков”. 🙂

к чему это я? да вот пробежала мега подборочка ООП багов – там в каментах тоже есть что почитать кроме “пацталом”.

Кто-то может что-то ещё вспомнить?

20 comments so far

  1. SiRex March 12, 2008 16:49

    Серега, это блин долбанный факт… полиморфизм – враг всех программистов #1 :)))

    Я вот даже пробовал твою задачку про веревки и спичку.. решают… а полиморфизм никак

  2. Restuta March 19, 2008 01:17

    =))) Все просто – понимание полиморфизма наступает тогда, когда ты не в книге прочитаешь, а когда попробуешь на практике И (там И) тебе ещё объяснит тот, кто уже понимает. Когда ты можешь позадовать вопросы =) А кстати попробуйте своими словами описать, что же такое полиморфизм =) Пожалуй я начну: “Полиморфизм – это изменчивость, т.е. изменяемое поведение объекта.”

  3. COTOHA March 25, 2008 13:35

    2 Restuta
    не согласен. просто, пока тебя не помучают, ты себе не даёшь труда разобраться. на самом деле понятие-то простое, вот только слово сложное… отпугивает наверное 🙂

    кстати, я вот тут перечитал пост и понял, что не все баги проявления полиморфизма. вернее даже все “неполиморфные”, кроме одного описанного. остальные – это от наследования в чистом виде.

    что удивительно – этот пост имеет наибольшее кол-во просмотров (за 300), но никто не обратил внимания на то, что я ошибся. интересно почему…

  4. Baziak April 11, 2008 20:28

    Недавно общались мы с другом о паттернах и об ООП в целом.
    Долго общались. В итоге пришли к мысли, что…

    Полиформизм суть реализация паттерна “Стратегия” на уровне языка программирования.

  5. alexissss May 12, 2008 18:42

    Ну что ж, скажу так о полиморфизме:
    – возможность взаимоподстановки (или взаимозаменяемости) объектов с одинаковым интерфейсом – одна версия,
    – это когда мама белокожая, а сын (дабы быть политкорректным) афроамериканской наружности – другая версия.
    Кстати, недавно проводил собеседование с одним ТОПом. Так вот он здорово плавал при ответе на простой вопрос: что такое проект?

  6. COTOHA May 12, 2008 23:27

    2 alexissss

    Кстати, недавно проводил собеседование с одним ТОПом. Так вот он здорово плавал при ответе на простой вопрос: что такое проект?

    про ТОПов не скажу, но пока не попался не один кандидат на должность менеджера проектов, кто смог бы внятно ответить на этот вопрос 🙂

  7. demon June 6, 2008 06:37

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

  8. COTOHA June 11, 2008 09:46

    2 demon
    ну на практике всё хорошо попробовать. тока, как показывает практика, все пробуют, но мало кто может объяснить.

  9. The Lex June 11, 2008 16:19

    Многие знания – многие печали. (к) 🙂
    Сможет ли человек, знающий определение сего слова, применять успешно его на практике и применять тогда, когда нужно, а не из принципа ли, из ограниченности ли, везде и всегда – вопрос открытый. Таких умных слов – вагон и маленькая тележка. Имхо, их понимание единообразно важно для понимание в каждой отдельно взятой команде чтобы не было разногласий о чем именно идет речь – обобщение сих терминов-слов – суть дело “философов от программирования”. Этим можно заняться “на кухне”, “за пивом”, етцетера 🙂 Практических плодов это редко приносит в обсуждении “сферических кенгуру в вакууме” в отрыве от практики. имхо, конечно. 🙂

  10. COTOHA June 11, 2008 17:31

    2 The Lex
    ээээ… не согласный.
    базовые знания ООП на то и БАЗОВЫЕ. на них базируется успешное применение туевой хучи остального – от простых сторонних компонент до паттернов.

    и при чём тут философия программирования? речь же не идёт об обобщении – у нас в IT, славбо, словарь устоявшийся.

  11. The Lex June 11, 2008 22:17

    Знания уровня слов “полиморфизм” действительно базовые. Базовые настолько, что в обычной практике их – сами понятия и принципы – применяешь даже не задумываясь особо, как это теоретически называется и уж тем более, как это теоретически могло бы быть или должно было бы быть или еще там что. Ты когда пишешь на русском языке – сильно часто о построении предложений задумываешься? Или вот, скажем, когда какое правило полемики применяешь – задумываешься тут же про себя, как же именно это правило называется? Или возмем что-то более неродное – английский язык: новичок думает перед тем как сказать, должен там быть Past или Past Participle (название пришлось в словаре искать – не помню как точно пишется) – а “просто спикеры” об этом уже давно не задумываются особо и вопросами “на грамматику” ты их поставишь в затруднение чаще всего. Да что там английский – кто сейчас может похвастаться тем, что сможет перечислить части речи, падежи, и члены предложения в русском языке? Кто-то может – будет ли это свидетельством его способности внятно объяснить тебе суть проекта? А кто-то – нет. Будет ли уже это – свидетельством обратного?

    “Полиморфизм” – это так, мелочи – имхо, самый убойный вопрос “про ООП” – назвать три ключевых “фичи” этой парадигмы. 😉 Да-да-да – тех самых, одна их которых – “полиморфизм”!

    “Сороножка задумалась о том, какую ногу вслед за какой следует ставить, и больше не смогла сделать ни шагу” (к) 😉

    ЗЫ: в целом же, кстати, у IT современный словарь довольно устоявшийся – штука, названная громким словом “паттерны проектирования”, позволяет в основном дать определенные и одинаковые имена одинаковым вещам – просто классифицировать. Нужно ли знание этого? Как я уже говорил – нужно в той мере, которая обеспечивает общий язык – “полиморфизм” к этому уже не относится – таки имхо. Как и “инкапсуляция”, например: я лично с трудом представляю себе современного программиста на чем-либо, для которого возможность объединения отдельных полей в целую структуру будет открытием…

    ЗЫЗЫ: кстати, Википедия называет полиморфизм ключевым принципом ООП – таки надо бы перечитать какие старые и подчитать какие новые _теоретические_ измышления на тему… 🙂

    ЗЫЗЫЗЫ: байки про кенгуру, про свиней, и пр. (про ракеты придется искать – не знаю такой) – это фолькльор – нанимай ядреных гуру на много тысяч у.е. и они тебе расскажут… 🙂 Дарю идею: собрать подобные байки в коллекцию – может даже классифицировать. 😉

    Я понял чего это ты такой злой… 🙂

  12. COTOHA June 12, 2008 12:46

    2 The Lex
    ты смотришь с колокольни сороконожки, которая уже умеет бегать (состоявшегося программиста). такой даже если забудет, то что-то придумает сказать. ну не мог же я сказать, что “все программисты не знают основ”? не мог.

    а я говорю о тех, кто только учится ходить – вот такие ДОЛЖНЫ учить основы – типа что ходят на ногах, а лазят на руках. матёрый чёрт про это не задумывается, а вот молодой такого может накрутить….

  13. The Lex June 12, 2008 13:37

    Я придумал как тебе эти байки использовать в (м)учении твоих кандидатов: рассказываешь ему одну из них и просишь пояснить, как же такое получилось с технической точки зрения. 🙂 Дарю!

    ЗЫ: имхо, нет лучшего учения чем практика – и в программировании в том числе.

  14. COTOHA July 8, 2008 00:10

    2 Ваня Нечаев
    да просто, в том-то и дело…

  15. smart August 9, 2008 07:35

    Серж, к тебе приходит человек, у которого на уме миллион мыслей, и главнейшая из них: “Ааа, о боже, какие страшные дядьки! Все, горностай мне… нет, песец. Ужос! Они спрашивают про полиморфизм! ОМГ! Теперь точно Серебристый песец моей карьере в этой компании. Блин, что же такое полиморфизм? Это же точно ООП! Я даже экзамен сдавал… черт… сейчас бы конспект…”.

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

    Объяснять именно так полиморфизм нивжисть никто не подумает, если не уверен ^_^

  16. COTOHA August 9, 2008 11:05

    2 smart
    о, привет, смарт! ну да, тут ты прав на 85% 🙂 конечно, почти никто не подумает, но мне-то хочется… это с одной стороны.

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

    ну и кстати, когда ты проходил собеседование у меня, то ты честно сказал, что “парни, я не знаю теории”. Но ты это компенсировал другими знаниями, так что по факту это незнание не помешало получить работу, ведь так?

  17. COTOHA August 9, 2008 12:17

    2 smart
    и в догонку – а прикольные ООП-баги вспомнить есть?

  18. Baka November 18, 2008 13:00

    я в книжке в одной читал что

    полиморфизм – способность разрешать вызовы методов в зависимости от типа объекта не взирая на тип указателя по которому происходит обращение к объекту.

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

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

  19. COTOHA November 18, 2008 16:03

    2 Baka
    я не люблю определения. когда тебя спрашивают “что такое XXX?”, то в большинстве случаев надо отвечать “зачем XXX нужно”. это более конструктивно и лучше показывает понимание предмета разговора.

  20. AlexNZ April 3, 2009 08:38

    2 Baka
    Вероятно вы имели в виду следующее:


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

Blogroll