LINUX.ORG.RU
ФорумTalks

Как рассказать человеку о полиморфизме?


0

0

Вообщем вот вторая половина в связи со сдачей экзамена озадачила вопросом, мол "Как на словах рассказать, что такое полиморфизм?", Ну, на пальцах объяснил, что "Вот мол представь комп, на котором слушаешь музыку, так вот к примеру вечером если ты включаешь музыку, то звук приходится выводить через наушники, днем если включаешь - то звук выводишь на колонки, вообщем один девайс в зависимости от условий по-разному работает". Вроде поняла, но теперь спрашивает "А как это преподавателю рассказать в разрезе изученного материала?". Собственно сабж, как то же самое можно не заморачиваясь объяснить девушке, чтоб не стыдно ей было потом перед преподом?

★★

> разрезе изученного материала

Смотря какой материал они изучала. А пример клёвый загнул. В продолжение: палка - она и копалка, и стукалка :-))))))))))

Anoxemian ★★★★★
()

скажи пущай книшку читает

bugmaker ★★★★☆
()

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

UserUnknown ★★★★★
()

Уважаемый edw1n а вы сами то представляете о чём пытаетесь челу рассказать ? колонки ... наушнеги ... комп ... LOL

robot12 ★★★★★
()

Вообще честно говоря не очень понял при чём тут полиморфизм..."""один девайс в зависимости от условий по-разному работает""" - это не полиморфизм... полиморфизм непосредсвенное следствие инкапсуляции и интерфейсов... так что скарее нужно что-то вроде """вне зависимости от такое какие колноки тебе придут, ты вобщем можешь поменят ьна них громкость, подключить/отключить, все они по разному вопроизводят звук, отличаюст как и снаружи так и внутри, но имеют _единый_ общий итерфейс..."""

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

Я лично из описания не стал бы делать вывод, что речь идёт об ООП.

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

Ну я-то примерно да, но проще уже рассказать не получается :)

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

>Как предмет называется?

Хороший вопрос, завтра к ней зайду узнаю :)))

edw1n ★★
() автор топика

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

Если нет за этот год, поискать у старших курсов.

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

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

+1, но подруга, думаю, сама из написанного своей рукой мало что понимает, раз спрашивать пришла :)

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

у Брокгауза и Ефрона встречаем такое определение: свойство некоторых тел принимать разные кристаллографич. формы (если в двух - назыв. диморфизмом), причем и другие физич. свойства различны. Так, сера бывает в кристаллах ромбич. и одноклиномерной сист.

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

>Фотку подруги и телефон в студию.

Как человек, у которого отсутствует чувство альтруизма, задам вполне уместный вопрос "А что МНЕ за это будет?" :))))))

Хотя не, всё-равно не дам :)

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

Тебе ничего не будет в любом случае :)

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

>Своди на "трансформеры" :)

Уже давал посмотреть :)

>Нам на примере швейцарского ножа объясняли.

Это как? О_о

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

> Это как? О_о

Да в прямом смысле, нож один, но в зависимости от вызова его методов (лезвий) может проявлять разные свойства. Если ему отломать неиспользуемые или добавить новые лезвия, будет объект-наследник исходного ножа, но обладающий отличным от родителя набором методов и свойств.

MiDoS
()

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

Evgueni ★★★★★
()

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

sin_a ★★★★★
()

http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84...

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество методов».

Хорошей иллюстрацией будет телефон. Тут будильник, и органайзер, камера, собственно телефон и вибратор. А ещё им можно орехи колоть.

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

2record:

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

Die-Hard ★★★★★
()
Ответ на: комментарий от record

record (*) (17.07.2007 19:46:23):

> Хорошей иллюстрацией будет телефон. Тут будильник, и органайзер, камера, собственно телефон и вибратор. А ещё им можно орехи колоть.

Кстати, пример ИМХО неудачный, как и с ножиком, и показывает, что приводящий этот пример не совсем представляет себе, что такое полиморфизм. От того, что ты добавишь камеру к телефону или новое лезвие к ножику ("новый статический метод"), ты полиморфизм не заработаешь.

Такой пример с телефоном возможен:

Если мобильник содержит разъем, на который при входящем звонке подается напряжение, то телефон становится полиморфным: можно поздравлять с днем рождения, если подарить его девушке, но можно дистанционно включать свет, если встроить его в простейшую схемку с выключателем; а если встроить его в бомбу и продать террористу, то можно использовать такой телефон как инструмент политического урегулирования, итд. -- в зависимости от того, какой их виртуальных методов устройства, в который вы встроили телефон, будет вызываться входящим звонком.

Die-Hard ★★★★★
()

Полиморфизм - способность по-разному отвечать на одинаковые сообщения. И фсе. Приведи в пример жену и блядь с ленинградки в контексте сообщения "отсосать за штуку".

ubber
()

У нас препод по ООП полиморфизм определял так: Возможность взаимодействия с объектом через реализуемый им интерфейс без привязки к специфике объекта.

Пример он приводил простой, хоть и немного высосанный из пальца(пересказываю своими словами): нужно написать программу, которая могла бы брать данные из различных источников, кодирвать/декодировать их разными алгоритмами и записывать в различные приёмники. Например, брать и записывать данные из файла, из памяти, из сети и т.п. Алгоритмы кодирования - base64, uue quoted-printable и т.п.

Пример не-полиморфной реализации, структурный подход без всяких функциональных указателей: написать по функции на каждый случай - encodeBASE64MemoryToMemory(), encodeBASE64MemoryToFile(), encodeBASE64MemoryToNetwork() и т.л. Подход, есесно, отвратителен, минусы додумывайте сами.

Пример полиморфной релаизации: В этой задаче можно выделить абстрактные сущности: ридер, кодек, райтер. Конкретные реализации - MemoryReader, NetworkReader, FileReader, (аналогично с райтерами), BASE64Encoder, ну и т.д. Соответствено, задача ридера - предоставить очередной байт из нижележащего источника, задача райтера - записать, кодека - уметь считать данные из ридера, закодировать их из дать райтеру. Таким образом, нужно созать интерфейсы ByteReader и ByteWriter, а у кодека будет, например, всего лишь один метод encode(ByteReader, ByteWriter), который будет работать с любой реализацией ридера и райтера.

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

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

KF(17.07.2007 21:58:10):

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

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

Die-Hard ★★★★★
()

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

smh ★★★
()

Полиморфизм в ООП насколько я помню это возможность давать одинкаковые имена функциям, обрабатывающим разные типы данных. Только что придумал пример: Дворецкий Берримор, если ему скажет Холмс "Берримор, сбда" принесёт трубку, еси тоже самое скажет Ватсон - кепку и трость, а если сэр Генри - тарелку овсянки :D

ЗЫ Не программер, прошу не бить ЗЗЫ Имхо, название термина не слишком удачное и не раскрывает сути.

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

>Как-то сумбурно получилось, но идею вроде передал.

Не, отлично! спасиб тебе большой!

[буду приводить пример, как иллюстрацию недостатков ООП]

grinn ★★
()

>Как на словах рассказать, что такое полиморфизм?

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

В дзен философском понимании - способность разных объектов делать одни и те же действия по разному. Например часы и дождь идут по разному.

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

DNA_Seq:

> Полиморфизм в ООП насколько я помню это возможность давать одинкаковые имена функциям, обрабатывающим разные типы данных.

Чушь ПОЛНАЯ, ты перепутал полиморфизм и перегрузку функций.

Наверное, не стОит изучать ООП на примере ЦеПП, способствует образованию каши в голове...

Die-Hard ★★★★★
()

Терпеть не могу когда ООП объясняют на "телевизорах", "компьютерах" и "собаках". Все намного проще: Есть цифра 5. Вопрос: "Какого она типа?". Целое? Ни разу. С плавающей точкой?. Еще чего. Правильный ответ - тип цифры 5 не известен. Точно, ее тип будет известен только тогда, когда она будет передаваться в какое-то выражение. Т.е. 5+3.14 -> float 5+3 -> int и.т.д. Вот это и есть полиморфизм.

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

Другой пример полиморфизма - тип "декартовы координаты" (a,b). Нам всеравно какие конкретные типы имеют a и b (вещественные, целые, текстовые), главное чтобы они реализовывали нужные нам методы. В С++ такие вещи решаются с помощью шаблонов или построения иерархии классов.

К сожалению, в С++, Delphi и т.п. полиморфизм существует в виде т.н. ad-hoc (специального) полиморфизма. В нескольких словах это значит следущее: хочешь полиморфизм - деалй сам. Поэтому в этих языках полиморфизм очень тесно связан с понятием "перегрузка" и "диспетчеризация". Правда и то и другое реализовано, мягко говоря странно. А двойная диспетчеризация вообще реализуется через паттерн Visitor. Все это привело к созданию фундаментального костыля под названием RTTI, хотя в целом картину это не улучшило.

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

В ООП понятие класс можно расматривать с 3-х точек зрения "класс-как-тип", "класс-как-интерфейс", и "класс-как-поведение". Соответственно с тех же точек зрения можно рассматривать и полиморфизм. Думаю, с какой точки зрения полиморфизм рассмотрен здесь догадаться не сложно, равно как привести примеры полиморфизма с других точек зрения.

Macil ★★★★★
()

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

А потом добавь, что в случае только программирования - всё ещё хуже.

Gharik
()
Ответ на: комментарий от KF

>А можно поподробнее, какие тут недостатки?

Не прарься, обычно "недостатки" ООП начинают искать, свежеиспеченные адепты языка хаскель. Но со временем это проходит...

Macil ★★★★★
()

>Как рассказать человеку о полиморфизме?

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

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

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

Orlangoor ★★★★★
()

добавлю свои "пару центов": чем рассуждать о высоких материях, спущусь на землю грешную и вспомню о самых обычных callbacks, примитивном, но мощном и нередко незаменимом средстве в том же С, славном предке С++. представьте себе библиотеку со стандартизованным API, интерфейсные методы в котором принимают в кацве аргументов копию/сцылку/указатель на некий класс А, методы которого в свою очередь и выступают в роли callbacks, библиотека была написана сторонним разрабом и её перекомпиляция недоступна/труднодоступна => без виртуальных функций класса А вызов перегруженного метода потомка А невозможен в принципе, ЖОПА! А вы говорите развитие, прогресс, то что в С делалось примитивными callbacks, в С++ возведено в ранг идеологии и преподносится как большое достижение! я не хочу сказать что С++ хуже С, но слишком много вещей в первом - это переусложнённые фичи второго, полученные в процессе переделки языка с целью облегчения разработки ПО и это "облегчение" имеет свою обратную нередко очень неприятную сторону, рубящую на корню другие очень полезные фичи С.

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

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

А вы гойворите, таки "прогресс"...

anonymous
()
Ответ на: комментарий от Macil

> Не прарься, обычно "недостатки" ООП начинают искать, свежеиспеченные адепты языка хаскель. Но со временем это проходит...

А ты, быдленький, считаешь что у убогой, очень частной и ограниченной модельки ООП нет недостатков? Ну тогда ты просто верующая, религиозная шпана, и программировать тебе нельзя - это дело не для тупых.

anonymous
()
Ответ на: комментарий от Macil

То, что ты рассказываешь - это говно, а не полиморфизм. Полиморфизм - это:

type 'a tree = Node of 'a tree * 'a tree | Leaf of 'a

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

ML давно начал изучать? Не волнуйся - пройдет. Особенно аргументация %Subj% говно, а не %Subj%. %Subj% - это ...

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

ML тут не при чём. Есть общая теория, описывающая полиморфные типы данных. ML - одна из мелких, частных реализаций (с читабельным синтаксисом).

anonymous
()
Ответ на: комментарий от Macil

> Ох да, и забыл, какое отношение рекурсивные типы данных имеют к ООП?

Ты выперднул нерелевантный пример про цифру 5. ADT я привёл в пику твоему дурному и ненужному примеру.

А ООП - это вообще говно, не заслуживающее обсуждения. Только строго формализованные системы имеют право на существование.

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

>Ты выперднул нерелевантный пример про цифру 5

А теперь давай по-честному. Сколько человек поймут твой пример? Мне вот очень много времени понадобилось чтобы не считать список, дерево, и S-выражение _разными_ структурами данных. А мой пример применим к практически любым языкам программирования, и самый простой. Вторым примером был приведен самый настоящий параметрический полиморфизм (если бы С++ его поддерживал). Третьим примером стоило бы привести иерархию "Shape" c виртуальными методами draw и collision, но боюсь студентов такими примерами до блевоты закормили, правда без двойной диспетчеризации...

И зачем рекурсивный тип данных в примере про алгебраический тип данных? Привел бы хотя бы List или хаскеловский Maybe... Мозги хочешь запудрить, показать что крут? Еще раз говорю - пройдет.

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

>> [буду приводить пример, как иллюстрацию недостатков ООП]

> А можно поподробнее, какие тут недостатки?

ну, ты сам посмотри на модель, что ты привел. Это же текст русской народной песни "Огород городить"!

Кратко недостатки ООП я бы описал так: "Создаем себе трудности, затем мужественно их преодолеваем".

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

> Сколько человек поймут твой пример?

 Все, кто в школе математику не прогуливал.

>  Мне вот очень много времени понадобилось чтобы не считать 
> список, дерево, и S-выражение _разными_ структурами данных.

 Ты всегда всё по диагонали читаешь? Это обычно на первой же 
странице пишут: что такое атом и пара.

 Ещё есть форма записи, понятная любому программисту, даже 
пыхпыхеру - BNF:

sexpr:
  | atom
  | (sexpr . sexpr)

 То, что эта вот палочка '|' и обозначает полиморфизм, допрёт 
даже потребитель вижуалвасика.

> А мой пример применим к практически любым языкам 
> программирования, и самый простой.

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

 А вот в случае с деревом, как с простейшей после односвязного списка
структорой, всё очевидно: сразу видно, что это параметрический 
полиморфизм, и видно явно из синтаксиса, какая часть структуры 
полиморфна.

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

anonymous
()
Ответ на: комментарий от Macil

>Не прарься, обычно "недостатки" ООП начинают искать, свежеиспеченные адепты языка хаскель. Но со временем это проходит...

1. Ни один инструмент не лишен недостатков.

2. Тот, кто об этих недостатках (aka "граблях") не осведомлен - обречен постоянно получать влоб этими самыми граблями.

3. Сам ты, похоже, об этом знаешь, но почему-то не желаешь, чтобы знали другие.

grinn ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.