Полиморфизм - идея, концепция, реализация

Тема в разделе "WASM.ZEN", создана пользователем Shimomochi, 2 мар 2007.

  1. Shimomochi

    Shimomochi New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    9
    Предлагаю к обсуждению один из краеугольных камней С++ - полиморфизм. А именно, предлагаю поговорить на тему виртуальных ф-ций, таблицы виртуальных ф-ций, множественного наследования, абстрактных классов и т.д., а так же все, что связано с этим понятием и конкретные реализации этой концепции в разных компиляторах.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Начинай :)
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В одной книженции читал что полиморфизм это когда одно имя функции, используется для разных значений, и показан пример что в Си для вычисления корня есть несколько функций: sqrt, fsqrt, а типа на плюсах можно одной. Вообщем бред полный, перепутать полиморфизм и перегрузку функций.
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    поли - много, морф- форма. Т.е. полиморфизм - многообразие форм! Перегрузка функций, операторов это инструмент с помощью которого можно достичь полиморфизма в некоторых случаях.
    Ладно это все теория, нафига оно надо на практике? Предположим, программист часто вызывает функцию расчета интерграла и он четко понимает, что есть разные типы! И что тип int это может по размеру и одинаково с float, но всеже разные вещи!!! Тут ему логично бы напивать две версии ф-ции Calc_Int(int arg) и Calc_Float(float arg), все вроде бы ок и вроде бы хорошо, все логично. Когда дела доходит до примения:

    result1 = Calc_Int(abc);
    result2 = Calc_Float(abc2);

    Это все нам привычно, однако возникает логичный вопрос: "А нельзя ли и для float и для int один интерфейс сделать?", иными словами Calc(abc) и Calc(abc2), это даст улучшение читабельности исходного кода.

    Где же еще можно его применить? А к примеру вы создали два экземпляра клacса Monser Monster1, Monser2. Возникла вдруг надобность в коде, что два монстра должны стать равными друг другу(сила, ловкость и др.) Че тогда делать?
    Ладно в int a = b; это просто, а как тут быть? Ответ прост: перегрузить для класса операцию присвоения, тогда объекты Monster1 = Monster2 можно будет также присваивать!

    ООП сила! Но чтобы это понять, мне пришлось долго плеваться, набить шишек, понять что я хочу упростить себе жизнь, и пересилить себя и почитать этого Гради Буча )))
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Да забыл сказать, что мы все, т.е. все люди уже с рождения мыслят объектами ! :) И именно это мышление переложили на программирование, ед. минус в таких приложениях, это увилечение размера исполнимых файлов и становится менее эффективным код. Но в силу того щас не 386 а выше процы, и не 64мб ОЗУ а выше, а дальше все это будет расти развиваться еще, то стоит ли думать о том: "А почему такой большой файл?". Я считаю не надо, когда человеку предложат 1500 уе за работу, которую надо будет сделать. То сомневаюсь что он будет думать о размере файла, если это в задаче не критично ! :)

    Почему мы так мыслим? Наверно кто нить видел, как молодые мамы, бабушки показывают на окно внучку и приговаривают: "Это окошко ванюша", у ребенка в мозгу сразу происходит набор запоминаний: окно прозрачно(свойство), твердое(свойство), легко трескаемое(мама как-то отругала за то что разбил в зале), легко режущее( палец до сих пор заживает). У него сразу если чтото увидит прозрачно, твердое - то вероятно это окно! :)
    Чтобы вы сказали, если бы вам сказали, что у вашей мамы крылья выросли? Не поверили бы, уверяю вас, вы бы не поверили! Почему? Да потому что вы подумали бы Мама это человек, а человек никогда крыльев не имел! Вывод какой?
    Вы уже думаете объектами и их поведениями, их свойствами!
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    EvilsInterrupt
    Значит перегрузка, это тоже полиморфизм, круто.
    Но если полиморфизм - это просто много форм, тогда везде сплошной полиморфизм. Ведь везде сплошные формы, и их много.
     
  7. Shimomochi

    Shimomochi New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    9
    Нет, полиморфизм и перегрузка, это действительно разные вещи. Что бы понять в чем заключается это различие, нужно смотреть на механизм реализации этих, совершенно разных, идей. Чуть позже я подробнее приведу свои мысли здесь на эту тему...
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Booster :)
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    вообще-то, перегрузка - это один из видов полиморфизма. А именно, статический полиморфизм.
     
  10. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Booster
    Читай мой пост, а еще лучше, если конечно тебе мозгов хватит, читать Гради Буча и Страуструпа. Второй осознал что надо преподнести народу ООП, а Буч сумел это пояснить простыми словами!

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

    На нашем примере:
    Полиморфизм - это цель, а вот перегрузка это инструмент и никак иначе!
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    EvilsInterrupt
    Буча не читал, читал Страуструпа. Да мне и в принципе пофене как что называть, просто путаница всё это. Я привык считать что перегрузка - это перегрузка. Но если полиморфизм это чисто абстрактное понятие, означающее просто многообразие форм, то я и не против. Зачем тогда пишут в книгах, что оно вполне конкретное понятие, тоже не ясно.
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Booster
    Когда ты пишешь программу ты не задумываешься как применить switch, потому что ты знаешь как он работает. Но узнал ты его, вероятно из книги. Пока ты читал книгу, тебе наверно попалось слово оператор и ты уже не думал, а что же такое слово "оператор"? Потому что кто-то когда то давным давно тебе пояснил его либо на словах, либо на пальцах, либо в литературе(прочитал книгу, статью, стихотворение )))).
    Вот этот самый "оператор" ты уже знаешь, поэтому ты можешь абстрагироваться и думать уже над switch, а не над словом "оператор" и его смыслом. Разве не так? :)

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

    ООП, я не говорю про полиморфизм в отдельности, он полностью покрывает эти 3 пункта! Почему? Потому что зная стандарт на предприятии, а на ООП его проще разработать, то программисты начинают как бы думать одинаково, следовательно продукт быстрее разрабатывается, поддерживается. Если написал код Ваня, то Олег тоже сможет разобраться в Ванинном коде, только потому что Ваня писал по стандарту конторы!

    ООП позволяет спасти проекты, путем того что все программисты отказываются от своих хочучек и привычек и пишут в единном стиле!

    Если следовать процедурному стилю программирования, то необходимо задуматься: "А какие задачи?", "Как задачи можно выполнить по отдельности?". Придет Санек, глянет код: "Такссс, тута Серый открыл файл, значит здесь я буду читать файл!", Пришел Валера глянул код Серого: "Так СЕрый тута открыл файл, Санька грамотно прочитал, щас я расчеты делать буду, мне нужна структура А, структура Б, структура С. Прямо рядом в этом месте и напишу, нафиг надо скролить лишний раз?". Пришел Серый в понедельник и сказал: "Раз уже саныч написал, пора уже закрыть файл"
    и так до бесконечности.

    А ООП-щик подумает не так, а так: "У меня должен быть Слон, тогда что он должен уметь?", "Может по мимо того что он махает хоботом, его летать научить?". Придет Ваня, глянет на код: "О Слон, значит он должен уметь махать хвостом", и он уже не полезет на форум и не спросит: "Помогите моему слону махнуть хвостом, пожалуйста, срочно!!!". А он четко знает, что слон просто обязан уметь "махать хоботом" и потому говорит: "Слон махни хоботом 3 раза"
     
  13. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    EvilsInterrupt
    Ты собрался уговорить всех присутствующих на васме перейти на ООП?
    Топик ведь не о том, какой ООП замечательный стиль, а о полиморфизме...
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Shimomochi

    Да фто вы гаварите.

    Перегрузка и шаблоны это статический полиморфизм. Сокрытие наследника за родителем - динамический полиморфизм. Статический "обретает форму" на этапе компиляции, динапический - на этапе выполнения.

    Будет очень интересно послушать эти самые мысли))

    rmn

    А человек дело говорит, хоть и немного амбициозен :)
     
  15. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    rmn
    Как ты будешь рассуждать о деньгах, если ты ни разу ниче некупил?
    Полиморфмизм прекрасен только в контексте ООП, остальные я даже не представляю.
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EvilsInterrupt
    Есть уровни выше ООП, как насчёт их? Там ещё быстрее разрабатывать, ещё надёжнее, ещё проще.
     
  17. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Shimomochi
    Тогда давай уж сразу про COM говорить, там как раз и приходится обращать внимание на реализацию полиморфизма и виртуальных функций, а говорить только в контексте С++, мне кажется лишено практического смысла.
     
  18. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1. только в контексте С++,
    В точку! Не язык красит программиста, а программист язык! Это доказал нам Страуструп, показав, что не надо останавливаться на достигнутом. Были и есть новые задачи, которые можно и нужно решать! Зачем ездить на велосипеде в Москву, если есть Автомобили и более эффективные средства!

    IceStudent
    Не спорю, есть выше, но тема про полиморфизм! А полиморфизм это один из 3х китов, на которых держится ООП! Так что будем беседовать про Наследование, полиморфизм или инкапсуляцию.

    зы:
    Очень часто приходится видеть вопли: "Ассемблер крут, си отстой" или же "Си отстой, паскаль форева", основное назначение программера творить, а не выпендриваться! Одно дело слышать вопрос: "как вызвать MessageBoxA ?" и другое: "Язык А отстой, Язык Б круче". Скажите мне кто программист, тот кто спросил про MessageBoxA ? Или кто языки сравнивает?
     
  19. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    ни тот, ни другой :)
     
  20. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    rmn
    Первый - это и есть программист, только начинающий! А чтобы гуру не бесили обилие таких вопросов, прудумываю FAQ ))) Но все же это программист, потому что он стремится решать задачу, а не разглагольствовать!