Re[7]: Что такое полиморфизм?
От: Eye of Hell  
Дата: 04.02.12 20:50
Оценка:
V>Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса. Какая именно из функций будет вызвана определяется во время компиляции.

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

V> Дворник Василий вам информацию задарма скинул?

V> Я так плохо разбираюсь в таких вещах, что надо погуглить:

Если вы плохо разбираетесь в таких вещах — зачем наезжать на программистов, у которых по 15 лет опыта коммерческой разработки? Наверное, я не просто так про полиморфизм написал именно то, что написал?
Re: Что такое полиморфизм?
От: batu Украина  
Дата: 04.02.12 21:03
Оценка:
Здравствуйте, Zender, Вы писали:

Z>Только начинаю касаться ООП.

Z>Подскажите, а что такое Полиморфизм. Ну вообще не догоняю. Если лучше на примере, можно и пример, просто и примитивный.
Z>Везде какой то бред написан, нихрена не пойму.
Z>Вот что такое Инкапсуляция, Наследование — это понятно. Это я вижу где приминить можно, где воспользоваться и т.д. А вот Полиморфизм вообще никуда не упирается.
Полиморфизм это наше все. Главная мысля что б одинаково было написано для разных применений. Т.е. в этом смысле и евкливодо пространство предпочтительно перед другими системами своим полиморфизмом. Теория относительности и ньютона и эйнштейна это, собственно, тоже замеченый ими полиморфизм. Удобней так. Вот это единственное и самое главное достоинство полиморфизма.
Re[7]: Что такое полиморфизм?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.02.12 21:21
Оценка:
Здравствуйте, Vaako, Вы писали:

V>Здравствуйте, VladD2, Вы писали:


V>Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса. Какая именно из функций будет вызвана определяется во время компиляции.


Сравни это с английской версией той же страницы http://en.wikipedia.org/wiki/C%2B%2B#Polymorphism, или со статьей, куда ведет ссылка из русской версии от слова "Полиморфизмом".
Re[2]: Что такое полиморфизм?
От: m e  
Дата: 04.02.12 21:26
Оценка:
EOH>В целом полиморфизм почему-то сильно связывают с ООП, но на мой профессиональный взгляд это все же разные штуки.

безусловно разные

в этой нитке уже пробегал пример фейла ооп, когда нужен полиморфизм -- это bool Icomparable::isGreater(Icomparable& lh);
Re[7]: Что такое полиморфизм?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.02.12 22:03
Оценка:
Здравствуйте, Vaako, Вы писали:

V>Хотя при двойной диспетчеризации нужно использовать и перегрузку и полиморфизм.

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

V>Хотя постойте, можно ведь все функции переделать добавив два новых аргумента foo(A* thisA, B* thisB, …. ).

разве что диспетчеризацию надо будет делать руками
Re[8]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 07:35
Оценка:
Здравствуйте, Eye of Hell, Вы писали:

V>>Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса. Какая именно из функций будет вызвана определяется во время компиляции.


EOH>Здесь описан частный случай одной из реализаций полиморфизма для конкретного языка. Автор забыл упомянуть, что это частный случай реализации — такое бывает, википедия, увы, несовершенна.


V>> Дворник Василий вам информацию задарма скинул?

V>> Я так плохо разбираюсь в таких вещах, что надо погуглить:

EOH>Если вы плохо разбираетесь в таких вещах — зачем наезжать на программистов, у которых по 15 лет опыта коммерческой разработки? Наверное, я не просто так про полиморфизм написал именно то, что написал?


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

http://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
Насле́дование — механизм объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.


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

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

С другой стороны, психологам известна интересная особенность естественного мышления, которую пока не удалось представить строго математически. Мышлению присуща способность выделить в рассуждении некоторой объект Х и заменить его на использование объекта Y с совершенно другими свойствами. Возможно это имеет какое-то отношение к единообразному манипулировнию совершенно разными объектами. Тогда неправ я и программист хотел сказать, что перегрузка и полиморфизм хотя и являются разными механизмами но вместе отражают эту странную способность человеческого мышления. Но достаточно ли в таком случае только перегрузки и полиморфизма? Я бы сказал в самом сложном случае перегрузка и полиморфизм преследуют одинаковую цель, и эта цель не выражается ни одним из них ни каким-либо другим механизмом или принципом, даже математической формулировки не имеет. Тогда да действительно не было никакого смысла в точных формулировках.
Re[8]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 07:42
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Vaako, Вы писали:


V>>Здравствуйте, VladD2, Вы писали:


V>>Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса. Какая именно из функций будет вызвана определяется во время компиляции.


S>Сравни это с английской версией той же страницы http://en.wikipedia.org/wiki/C%2B%2B#Polymorphism, или со статьей, куда ведет ссылка из русской версии от слова "Полиморфизмом".


Да точно:

Polymorphism enables one common interface for many implementations, and for objects to act differently under different circumstances.


Это один к одному определение перегрузки функций, особенно если переводить "one common interface" как разные сигнатуры у функций. Очевидно упоминание "перегрузка функций — это один из самых банальных способов реализации полиморфизма" тут как раз к месту. Осталось только уточнить что означает самый банальный "common interface". Я не прав7
Re[8]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 07:49
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Vaako, Вы писали:


V>>Хотя при двойной диспетчеризации нужно использовать и перегрузку и полиморфизм.

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

V>>Хотя постойте, можно ведь все функции переделать добавив два новых аргумента foo(A* thisA, B* thisB, …. ).

S>разве что диспетчеризацию надо будет делать руками

Да можно, как и перегрузку без полиморфизма, поскольку это разные механизмы вообще. Вопрос же заключается, почему опыт программиста подсказывает использовать совершенно разные механизмы для практически очень похожих задач. Вы же не собираетесь переименовать перегрузку в "примитивный полиморфизм"?
Re[6]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 08:04
Оценка:
Здравствуйте, Eye of Hell, Вы писали:

EOH>Не понял вашего вопроса. При чем тут перегрузка методов классов, код которых недоступен на момент компиляци? Если код на момент компиляции недоступен — то средствами языка с static binding оно не перегружается. Для таких вещей другие конструкции придумали — тот же COM, например.


Потому что вы сами говорили:

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


хотя опыт вам подсказывает иногда обратное. Скажем так, зачем программист использует полиморфизм? Уточнение терминологии тут мало чем поможет, поскольку мы не знаем как мыслит программист. Опыт на самом деле не подтверждает теорию, он может ее только опровергнуть.
Re[9]: Что такое полиморфизм?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.02.12 08:05
Оценка:
Здравствуйте, Vaako, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>Да точно:


V>

V>Polymorphism enables one common interface for many implementations, and for objects to act differently under different circumstances.


V>Это один к одному определение перегрузки функций, особенно если переводить "one common interface" как разные сигнатуры у функций. Очевидно упоминание "перегрузка функций — это один из самых банальных способов реализации полиморфизма" тут как раз к месту.

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

V>Осталось только уточнить что означает самый банальный "common interface". Я не прав7

Можно пойти дальше по википедии к определению interface, а значение common посмотреть в справочнике, т.к. википедия на "common interface" предлагает статью о девайсе в телевизоре.
Re[9]: Что такое полиморфизм?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.02.12 08:12
Оценка:
Здравствуйте, Vaako, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>>>Хотя постойте, можно ведь все функции переделать добавив два новых аргумента foo(A* thisA, B* thisB, …. ).

S>>разве что диспетчеризацию надо будет делать руками

V>Да можно, как и перегрузку без полиморфизма, поскольку это разные механизмы вообще.

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

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

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

V>Вы же не собираетесь переименовать перегрузку в "примитивный полиморфизм"?

не собираюсь.
Re[10]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 09:00
Оценка:
Здравствуйте, samius, Вы писали:

V>>Это один к одному определение перегрузки функций, особенно если переводить "one common interface" как разные сигнатуры у функций. Очевидно упоминание "перегрузка функций — это один из самых банальных способов реализации полиморфизма" тут как раз к месту.

S>Перегрузка функций — не самый банальный способ реализации полиморфизма. Есть еще банальнее: арифметические операторы в ЯП, как правило, являются полиморфными, даже в тех ЯП, которые не позволяют перегрузку операторов или даже функции как таковые.

V>>Осталось только уточнить что означает самый банальный "common interface". Я не прав7

S>Можно пойти дальше по википедии к определению interface, а значение common посмотреть в справочнике, т.к. википедия на "common interface" предлагает статью о девайсе в телевизоре.

Так можно заблудиться и не вернутся.

Ещё в 1960-х гг. Р. Хиндли (Roger Hindley) исследовал типизацию в комбинаторной логике. Его проблемной областью была типизация в языках, основанных на теории лямбда-исчисления. Позднее, в конце 1960-х годов, тот же учёный исследовал полиморфные системы типов. Позже, в 1970-х годах, Робин Милнер предложил практическую реализацию расширенной системы полиморфной типизации для языка функционального программирования ML.


Так что говоря о полиморфизме вы подразумеваете полиморфные типы, а в общем математическом смысле полиморфизм не реализован ни в одном языке программирования. Кроме того, математический полиморфизм не покрывает всех возможностей обобщений естественного языка, так что либо использовать точные термины и уточнять о каком именно полиморфизме речь, либо признать что полиморфность человеческого мышления пока остается вне математический определений. А так как вы делать и то и другое я не могу.
Re[11]: Что такое полиморфизм?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.02.12 09:11
Оценка:
Здравствуйте, Vaako, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>Так что говоря о полиморфизме вы подразумеваете полиморфные типы

Полиморфные системы типов — знаю. А что такое полиморфные типы — нет.

V>а в общем математическом смысле полиморфизм не реализован ни в одном языке программирования.

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

V>Кроме того, математический полиморфизм не покрывает всех возможностей обобщений естественного языка

Я не специалист в области естественных языков, это со мной можно не обсуждать.
Re[10]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 09:13
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Vaako, Вы писали:


V>>Здравствуйте, samius, Вы писали:


V>>>>Хотя постойте, можно ведь все функции переделать добавив два новых аргумента foo(A* thisA, B* thisB, …. ).

S>>>разве что диспетчеризацию надо будет делать руками

V>>Да можно, как и перегрузку без полиморфизма, поскольку это разные механизмы вообще.

S>Перегрузка — частный случай полиморфизма, потому использовать перегрузку без полиморфизма не получится.

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

S>Может быть потому что программист может анализировать, какой механизм подойдет лучше в конкретном случае? Причем тут название концепции? Программист ведь может использовать и совершенно одинаковые механизмы для очень различных задач.

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

V>>Вы же не собираетесь переименовать перегрузку в "примитивный полиморфизм"?

S>не собираюсь.

Но в первом предложении применили. Ваш полиморфизм в общем случае не охватывает всей гибкости человеческого мышления. Потому нет никакого смысла продолжать, сразу можно свести все к 4 принципам Фоннеймана и спорить о них. Что весть полиморфизм во всех языках программирования выходит за рамки этих 4 принципов? Я думаю нет, а значит и спорить вроде как не очем больше. И терминов меньше
Re[12]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 09:15
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Vaako, Вы писали:


V>>Здравствуйте, samius, Вы писали:


V>>Так что говоря о полиморфизме вы подразумеваете полиморфные типы

S>Полиморфные системы типов — знаю. А что такое полиморфные типы — нет.

V>>а в общем математическом смысле полиморфизм не реализован ни в одном языке программирования.

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

V>>Кроме того, математический полиморфизм не покрывает всех возможностей обобщений естественного языка

S>Я не специалист в области естественных языков, это со мной можно не обсуждать.

Согласен, обсуждение должно основываться на обмене мнениями, а скептицизм одного по отношению к мнению другого обсуждением являться не может по определению.
Re[11]: Что такое полиморфизм?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.02.12 10:23
Оценка:
Здравствуйте, Vaako, Вы писали:

V>Здравствуйте, samius, Вы писали:


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

S>>Может быть потому что программист может анализировать, какой механизм подойдет лучше в конкретном случае? Причем тут название концепции? Программист ведь может использовать и совершенно одинаковые механизмы для очень различных задач.

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

Что подразумевать под "мыслить разные объекты одинаково"? Что за математический смысл? Он отличается от того что описано в википедии? Если да, то я о нем не знаю и рассуждать об этом не спешу.

V>Программист вынужден спуститься на землю и применить известные ему технические приемы, возможно не имеющие к полиморфизму классов никакого отношения. Полиморфизм в мышлении нужен для рассуждений, а в программировании — для представления программы в конечном виде. Потому это разные вещи и для разных целей.

Это имеет какое-то отношение к тому что перегрузка есть полиморфизм?

V>>>Вы же не собираетесь переименовать перегрузку в "примитивный полиморфизм"?

S>>не собираюсь.

V>Но в первом предложении применили.

Я сказал: перегрузка — это частный случай полиморфизма. Есть возражения по сути?

V>Ваш полиморфизм в общем случае не охватывает всей гибкости человеческого мышления.

Не собираюсь рассуждать о гибкости человеческого мышления, спасении вселенной и т.п.
Re[13]: Что такое полиморфизм?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.02.12 10:25
Оценка:
Здравствуйте, Vaako, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>>>Так что говоря о полиморфизме вы подразумеваете полиморфные типы

S>>Полиморфные системы типов — знаю. А что такое полиморфные типы — нет.
Что такое полиморфные типы?

V>>>а в общем математическом смысле полиморфизм не реализован ни в одном языке программирования.

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

V>>>Кроме того, математический полиморфизм не покрывает всех возможностей обобщений естественного языка

S>>Я не специалист в области естественных языков, это со мной можно не обсуждать.

V>Согласен, обсуждение должно основываться на обмене мнениями, а скептицизм одного по отношению к мнению другого обсуждением являться не может по определению.

Дальнейший обмен мнениями невозможен без уточнения терминов "полиморфный тип", "общий математический смысл полиморфизма".
Re[9]: Что такое полиморфизм?
От: Eye of Hell  
Дата: 06.02.12 11:27
Оценка:
EOH>>Здесь описан частный случай одной из реализаций полиморфизма для конкретного языка. Автор забыл упомянуть, что это частный случай реализации — такое бывает, википедия, увы, несовершенна.
V>Но как только кто либо упоминает "Полиморфизм" это сразу подразумевает и "наследование", поскольку это сильно связанные понятия.

Боюсь, это не так. Наследование — это прежде всего один из способов композиции, при котором общее для нескольких фрагментов кода поведение выносится в иерархию "родительских классво". Да, в большинстве языков механизм наследования включает в себя также механизм для реализации полиморфизма времени исполнения — переопределение функций и/или интерфейсы. Но поддржка переопределения методов — это только малая часть механики наследования. А понятия у нас все сильно связанные — область такая. Многие вон, говорят "процессор" — а подразумевают "системный блок". Но это не повод утверждать что "одно и то же, потому что сильно связанные понятия".

V>http://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

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

V>Другими словами "Полиморфизм" не является отдельным независимым понятием или концепцией как перегрузка функций.

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

V>Даже если мы применяем "Полиморфизм" применительно к функциям, а не классам. Технически это совершенно разные механизмы и могут быть совмещены в одном и том же классе. Перегрузка начинается и заканчивается на этапе компиляции производя поиск и выбор одной функции из множества. Полиморфизм не требует никакого поиска или выбора, поскольку компилятор вставляет сразу либо конкретную функцию, либо блок вызывающий функцию через таблицу виртуальных функций, либо блок осуществляющий поиск нужной функции при множественном наследовании. Эти и другие механизмы срабатывают во время исполнения, а не компиляции.


У меня крепнет подозрение что вы все же путаете полиморфизм и переопределение методов (override). То что вы пишете про таблицы виртуальных функций — это частный случай реализации переопределения методов для C++, который в свою очередь используется для организации полиморфизма времени исполнения. Но, хочу вас огорчить — в COM и GLib то же самое реализвано на чистом C, без классов и наследования.

V>Следовательно, в первом приближении, если опыт подсказывает, что полиморфизм скорее перегрузка, то, либо опыт не заслуживает доверия, либо программист сам не понимает что говорит. Сравнивать полиморфизм с перегрузкой все равно что сравнивать коров с заборами. Хотя переход к точным формулировкам если и разрешит путаницу, но, имхо, из=за своего математически-подобной формулировки, прививающий математический способ мышления, плохо отражает естественное мышление программиста.


В первом приближении мы оперируем понятиями, которые кто-то сформулировал и затемсформулированое было признано общественностью. Так вот мы, программисты, когда говорим про полиморфизм, оперируем вот этим:
http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
То же самое написано во всех учебниках по computer science, начиная от SICP и заканчивая "The Art of Computer Programming".
А чем оперируете вы я в упор не понимаю — какие-то вырванные из контекста фрагменты из русской википедии.

V>Например, все математические рассуждения без исключения исследуют только такие объекты, которые не меняются во время этого самого рассуждения. В математике правила рассуждения заданы в исходных предпосылках и аксиомах и не меняются на протяжении рассуждений. Программист же работает с постоянно меняющейся программой. В любом случае упоминание полиморфизма подразумевает и требует упоминание наследования, инкапсуляции и абстракции.


Если я вам скажу, что полиморфизм можно реализовать не только с помощью наследования и классов, но и с помощью шаблонов — вас это убедит?

V>С другой стороны, психологам известна интересная особенность естественного мышления, которую пока не удалось представить строго математически. Мышлению присуща способность выделить в рассуждении некоторой объект Х и заменить его на использование объекта Y с совершенно другими свойствами. Возможно это имеет какое-то отношение к единообразному манипулировнию совершенно разными объектами. Тогда неправ я и программист хотел сказать, что перегрузка и полиморфизм хотя и являются разными механизмами но вместе отражают эту странную способность человеческого мышления. Но достаточно ли в таком случае только перегрузки и полиморфизма? Я бы сказал в самом сложном случае перегрузка и полиморфизм преследуют одинаковую цель, и эта цель не выражается ни одним из них ни каким-либо другим механизмом или принципом, даже математической формулировки не имеет. Тогда да действительно не было никакого смысла в точных формулировках.


Перегрузка — это один из механизмов реализации полиморфизма. Другие механизмы — переопределение, шаблоны, dynamic dispatch и много чего еще.
Re[12]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 12:09
Оценка:
Здравствуйте, samius, Вы писали:

V>>Но в первом предложении применили.

S>Я сказал: перегрузка — это частный случай полиморфизма. Есть возражения по сути?

Какая перегрузка какого полиморфизма?
Re[10]: Что такое полиморфизм?
От: Vaako Украина  
Дата: 06.02.12 12:40
Оценка:
Здравствуйте, Eye of Hell, Вы писали:

EOH>>>Здесь описан частный случай одной из реализаций полиморфизма для конкретного языка. Автор забыл упомянуть, что это частный случай реализации — такое бывает, википедия, увы, несовершенна.

V>>Но как только кто либо упоминает "Полиморфизм" это сразу подразумевает и "наследование", поскольку это сильно связанные понятия.

EOH>Боюсь, это не так. Наследование — это прежде всего один из способов композиции, при котором общее для нескольких фрагментов кода поведение выносится в иерархию "родительских классво". Да, в большинстве языков механизм наследования включает в себя также механизм для реализации полиморфизма времени исполнения — переопределение функций и/или интерфейсы. Но поддржка переопределения методов — это только малая часть механики наследования. А понятия у нас все сильно связанные — область такая. Многие вон, говорят "процессор" — а подразумевают "системный блок". Но это не повод утверждать что "одно и то же, потому что сильно связанные понятия".


V>>http://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

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

V>>Другими словами "Полиморфизм" не является отдельным независимым понятием или концепцией как перегрузка функций.

EOH>В упор не вижу как из приведенной фразы следует, что полиморфизм не является независимым понятием. Перегрузка (overload) функции на числовой и строковый аргумент, как в моем примере — типичный полиморфизм времени компиляции, это в любом учебники написано. В википедии тоже — ниже по топику ссылки приводили. Обратите внимание — обычные функции, никаких классов, и, тем более, наследования.


V>>Даже если мы применяем "Полиморфизм" применительно к функциям, а не классам. Технически это совершенно разные механизмы и могут быть совмещены в одном и том же классе. Перегрузка начинается и заканчивается на этапе компиляции производя поиск и выбор одной функции из множества. Полиморфизм не требует никакого поиска или выбора, поскольку компилятор вставляет сразу либо конкретную функцию, либо блок вызывающий функцию через таблицу виртуальных функций, либо блок осуществляющий поиск нужной функции при множественном наследовании. Эти и другие механизмы срабатывают во время исполнения, а не компиляции.


EOH>У меня крепнет подозрение что вы все же путаете полиморфизм и переопределение методов (override). То что вы пишете про таблицы виртуальных функций — это частный случай реализации переопределения методов для C++, который в свою очередь используется для организации полиморфизма времени исполнения. Но, хочу вас огорчить — в COM и GLib то же самое реализвано на чистом C, без классов и наследования.


V>>Следовательно, в первом приближении, если опыт подсказывает, что полиморфизм скорее перегрузка, то, либо опыт не заслуживает доверия, либо программист сам не понимает что говорит. Сравнивать полиморфизм с перегрузкой все равно что сравнивать коров с заборами. Хотя переход к точным формулировкам если и разрешит путаницу, но, имхо, из=за своего математически-подобной формулировки, прививающий математический способ мышления, плохо отражает естественное мышление программиста.


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

EOH>http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
EOH>То же самое написано во всех учебниках по computer science, начиная от SICP и заканчивая "The Art of Computer Programming".
EOH>А чем оперируете вы я в упор не понимаю — какие-то вырванные из контекста фрагменты из русской википедии.

V>>Например, все математические рассуждения без исключения исследуют только такие объекты, которые не меняются во время этого самого рассуждения. В математике правила рассуждения заданы в исходных предпосылках и аксиомах и не меняются на протяжении рассуждений. Программист же работает с постоянно меняющейся программой. В любом случае упоминание полиморфизма подразумевает и требует упоминание наследования, инкапсуляции и абстракции.


EOH>Если я вам скажу, что полиморфизм можно реализовать не только с помощью наследования и классов, но и с помощью шаблонов — вас это убедит?


V>>С другой стороны, психологам известна интересная особенность естественного мышления, которую пока не удалось представить строго математически. Мышлению присуща способность выделить в рассуждении некоторой объект Х и заменить его на использование объекта Y с совершенно другими свойствами. Возможно это имеет какое-то отношение к единообразному манипулировнию совершенно разными объектами. Тогда неправ я и программист хотел сказать, что перегрузка и полиморфизм хотя и являются разными механизмами но вместе отражают эту странную способность человеческого мышления. Но достаточно ли в таком случае только перегрузки и полиморфизма? Я бы сказал в самом сложном случае перегрузка и полиморфизм преследуют одинаковую цель, и эта цель не выражается ни одним из них ни каким-либо другим механизмом или принципом, даже математической формулировки не имеет. Тогда да действительно не было никакого смысла в точных формулировках.


EOH>Перегрузка — это один из механизмов реализации полиморфизма. Другие механизмы — переопределение, шаблоны, dynamic dispatch и много чего еще.


Ладно уламали. Но в СОМ есть наследование интерфейсов, нету наследования реализаций.

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