Чем полиморфизм отличается от наследования? #772844


#0 by los_hooliganos
Что-то не могу въехать. По мере изучения ООП, для меня это де факто одно и тоже. Хотя в учениях об ООП это делят на 2 разные вещи. И вообще можно пример где есть наследование, но нет полиморфизма
#0 by los_hooliganos
Что-то не могу въехать. По мере изучения ООП, для меня это де факто одно и тоже. Хотя в учениях об ООП это делят на 2 разные вещи. И вообще можно пример где есть наследование, но нет полиморфизма
#0 by los_hooliganos
Что-то не могу въехать. По мере изучения ООП, для меня это де факто одно и тоже. Хотя в учениях об ООП это делят на 2 разные вещи. И вообще можно пример где есть наследование, но нет полиморфизма
#0 by los_hooliganos
Что-то не могу въехать. По мере изучения ООП, для меня это де факто одно и тоже. Хотя в учениях об ООП это делят на 2 разные вещи. И вообще можно пример где есть наследование, но нет полиморфизма
#1 by ДенисЧ
Наследование - это у объекта есть методы родителя Полиморфизм - это когда одну функцию можешь вызывать с разными параметрами. Это коротко и для чайников
#2 by vvp91
Полиморфизм - способность метода обрабатывать параметры разных типов. Наследование - способность объекта выдавать себя за родителя. В 1С протокольно все процедуры и функции полиморфны, т.е. нет платформенного ограничения на тип передаваемых значений. Например, есть в БСП функция ОбщегоНазначения.ЗначенияРеквизитовОбъекта, принимающая параметр Ссылка - этот параметр может быть любого ссылочного типа. Еще пример, можно написать метод, принимающий параметр Объект, а внутри читающий от этого объекта два поля через точку (Дата, Номер). Тогда в этот метод можно передать: - ссылку на любой документ - или данные формы документа (основной реквизит Объект) - или структуру с двумя этими полями - или выборку из запроса с двумя этими полями - или строку таблицы значений с двумя этими полями - и т.д. Это и есть полиморфизм. Наследования в 1С нет. Хотя с появлением расширений конфигурации появляется "псевдонаследование", когда переопределяется поведение методов форм и модулей.
#3 by b_ru
Наследование в 1С таки есть, но только то, что прошито в платформу, свои классы на основании родительских нельзя определять. Например, класс "Документ.РеализацияТоваровУслуг" наследуется от класса "Документ" и т.п.
#4 by GenAcid
Насколько я помню полиморфизм это способность переопределять методы и свойства предка. Возможно не прав, давно по ООП теорию не читал.
#5 by Рэйв
>>для меня это де факто одно и тоже. хренасе одно и тоже. Имхо, тупой вброс.
#6 by spock
для какого языка программирования нужно?
#7 by los_hooliganos
Скажем так, полиморфизм и наследование очень тесно связаны. Если считать это 2мя разными штуками. Инкапсуляция где-то в сторонке от них. Кстати обращение к свойству или методу через 2 точки как в и есть нарушение правила инкапсуляции.
#8 by los_hooliganos
Речь о JAVA
#9 by spock
#10 by los_hooliganos
Насчет вброса, я тут на выходных изучал рефлексию класса/объекта и у меня мозг окончательно взорвался.
#11 by Рэйв
да нифига они не связаны. для Полиморфизма нужно описывать каждый вариант вызова.А наследование указывается при создании класса. Учи мат часть ужеке
#12 by DDwe
Тролит он и толсто очень. Он же не тупой.
#13 by Рэйв
Да я так и понял с самого начала:-)
#14 by spock
Все что ли? Продолжения кина не будет?
#15 by Рэйв
неинтересный троль попался:-)
#16 by spock
Так-то ты не прав, если судить по
#17 by los_hooliganos
Автора на хабре раскритиковали, что полиморфизм нужон для интерфейсов, а не для наследников базового класса. Хотя в последнем случае он тоже работает.
#18 by Рэйв
Ну обоснуй:-)
#19 by spock
В компилируемых ЯП полиморфизм реализуется через наследование. Что еще обосновывать? Можно, конечно, изобрести велосипед, применив рефлексию или методы определения типов, но это колхоз.
#20 by Рэйв
Полиморфизм вообще сдлабо привязан к наследованию. Я могу создать 50 вариантов описания вызова функции Foo, но это ни на шаг не приблизит ее к классу и наследованию.
#21 by spock
50 определений функции - полиморфизм?
#22 by Рэйв
Естественно.
#23 by spock
+21 я не понял логики в приведенном примере про 50 определений.
#24 by spock
А, ну садись два :)
#25 by Рэйв
Вызов одноименной функции с разными типами и количества параметров. А что такое полиморфизм в твоем понимании?
#26 by butterbean
ничто не предвещало срача... хотя нет, предвещало
#27 by Рэйв
ну ну:-)
#28 by woww
Полиморфизм это когда процедура может принимать значения разных типов. А наследование это когда один класс/объект может наследовать параметры от другого. Инкапсуляция это хранение данных вместо с кодом.
#29 by spock
50 определений функции - это не полиморфизм, а переопределение. Читать, например, тут:
#30 by Encode
Полиморфизм это когда ты разные объекты объединяешь и обрабатываешь по одинаковым свойствам. Например у класса House и Car реализуем интерфейс Priceble (имеющие стоимость), и потом в коде ты можешь создать New ArrayList<Priceble>, запихнуть туда дом, машину, и вызывать у них методы своего интерфейса
#31 by Encode
Это перезагрузка методов.
#32 by Рэйв
не..я больше тролей кормить не буду:-)
#33 by spock
Правильно! Не нужно. Нужно просто почитать матчасть, например, там же рядом:
#34 by Encode
Соответственно полиморфизм вытекает из наследования. Самый простой пример в java это класс Object - родитель всех классов. Ты можешь вообще любые объекты объединить в массив Object-ов и вызывать методы Object у всех них. Это и будет полиморфизм.
#35 by los_hooliganos
Получается разные конструкторы одного и того же объекта и есть полиморфизм в 1с?
#36 by woww
В 1с динамическая типизация. Значит по умолчанию все процедуры и функции полиморфны, т.к. могут принимать значения разных типов.
#37 by los_hooliganos
В чем колхозность рефлексии? Я так понимаю рефлексия нужна для разработки инструментов. Например написание калькулятора, который будет считать только по тем командам, которые я ему передам текстовым файлом.
#38 by spock
Полиморфизм - это когда компилятор сам определяет, метод какого класса дернуть. Не какую из переопределенных функций, а именно метод какого класса.
#39 by spock
Колхозность не рефлексии, а реализации полиморфизма через рефлексию.
#40 by spock
Коллеги, вы в институте пары по программированию прогуливали чтоли? :)
#41 by los_hooliganos
Я вообще не ходил на программирование в институте, потому что его не было.
#42 by spock
Все еще не понятно, что такое полиморфизм?
#43 by woww
Какое нафиг ООП в 1с ? Ты не можешь создавать свои классы. Значит нету и ООП.
#44 by Рэйв
да прочитай уже и успокойся:-)
#45 by Рэйв
"полиморфизмом называется способность функции обрабатывать данные разных типов" Предельно доступно для понимания помоему:-)
#46 by los_hooliganos
Примерно понятно. Непонятно почему он так сильно выделен от наследования. :)
#47 by spock
Ты прочитал начало wiki-статьи и решил нас научить? Читай дальше: "В сообществе объектно-ориентированного программирования под термином «полиморфизм» обычно подразумевают наследование, а использование параметрического полиморфизма называют обобщённым программированием[8], или иногда «статическим полиморфизмом»."
#48 by Рэйв
просто мы спорим о частностях одного целого:-)
#49 by kauksi
А про инкапсуляцию забыли?
#50 by los_hooliganos
Инкапсуляция это вьюшки и представления в SQL
#51 by spock
Наследование - это расширение, переопределение функциональности. А полиморфизм - это способ реализации интерфейсного метода, через наследование.
#52 by Тролль главный
и неверно
#53 by spock
Я даже не пытался спорить. А так, да, можно сказать, что полиморфизм - это частность ООП'шного ЯП.
#54 by Тролль главный
Тупым 1Сникам это не нужно
#55 by ДенисЧ
Обоснуй
#56 by spock
Классическое объяснение: Работают два программиста над проектом (java/c++). Один программирует взаимодействие пользователя с программой (нажатие кнопки "Рисовать фигуру"), другой - реализует конкретную реализацию рисования фигур "Круг" или "Квадрат". Интерфейщик пишет такой код: Процедура ПриРисовании(Фигуры* Фигура, handle НаЧемРисовать)    Фигура->Рисовать(НаЧемРисовать); КонецПроцедуры // ПриРисовании И он не знает, какая фигура будет рисоваться, да и не хочет знать. Второму программисту-функциональщик приходится рисовать три класса: 1. Абстрактный Класс "Фигуры" с методом Рисовать(handle) 2. Прикладной класс "Круг" с методом Рисовать(handle) 2. Прикладной класс "Квадрат" с методом Рисовать(handle) И в обоих классах "Круг" и "Квадрат" реализуется логика рисования конкретной фигуры. и в момент вызова Фигура->Рисовать(НаЧемРисовать) компилятор сам определяет какой из классов использовать, чтобы вызвать конкретную реализацию метода. Т.е. в точке вызова нет контекста, есть только тип. Сессно, что перед использованием ПриРисовании нужно где-то написать так: Фигуры* Фигура = new Круг или Фигуры* Фигура = new Квадрат
#57 by Лефмихалыч
он хочет достебаться до "с разными параметрами", ведь они, строго говоря, не совсем разные
#58 by spock
После стало понятнее? :)
#59 by woww
А если рантайм определяет какой метод какого класса дергнуть.  Это уже не полиморфизм?
#60 by spock
в акцент был не на компиляторе, а на выборе класса, чтобы вызвать одноименной метод.
#61 by Тролль главный
наследование - способ построения новых типов через имеющиеся (базовые типы) с возможностью собственной специализации (новые методы, поля, свойства) полиморфизм - изменение поведения функций (методов) подтипа по сравнению с базовым поведением
#62 by woww
А я сразу подумал что там где вызов функции определяется динамически, а не при компиляции. Полиморфизм перестал быть полиморфизмом.
#63 by los_hooliganos
Это все понятно.
#64 by rs_trade
Простой пример полиморфизма обычный + хотя бы в 1С. В одном случае складывает числа, в другом например строки. Интерфейс один, но результат разный и зависит от типа входных данных.
#65 by sash-ml
Полиморфизм методов(с разным количеством параметров) <> полиморфизму объектов с методами с одинаковой сигнатурой в одной иерархии наследования. - не копмилятор. + рантайм на этапе выполнения, так как неизвестно какой объект будет создан.
#66 by woww
А если у меня динамический язычек,  в котором нету интерфейсов (т.к. не нужны) например JavaScript, то у меня уже нету полиморфизма?
#67 by Тролль главный
да, потому что в 1С нет типизации а вообще это совпадение сигнатур - не более то есть вот это: class A { public:   void Test; } class B { public:   void Test; } не полиморфизм, а просто совпадение имен
#68 by ViSo76
ДенисЧ вызов функции с разными параметрами называется перегрузка функции. Это так для чайников. Есть тип переменной типа Variant это не полиморфизм. Полный бред. Есть прототип объекта документ, то что он работает с разным количеством полей это не означает наследование.
#69 by los_hooliganos
вот полиморфизм toString в 1С: ОбработкаПолученияПредставления(<Данные>, <Представление>, <СтандартнаяОбработка>)
#70 by spock
" - не копмилятор." - и да, и нет. Конечно же компилятор не знает, какой из классов в данном конкретном случае использовать на этапе компиляции. Компилятор в таких местах вставляет обвязку из таблиц виртуальных методов.
#71 by spock
Мне кажется, я в это пояснил. Дело не в компиляторе, дело в виртуальных таблицах.
#72 by woww
Если хочешь "понять" проблемы полиморфизма. Возьми язычек со статической типизацией типа C#, Java. В динамике проблемы полиморфизма нету.
#73 by ViSo76
Ты не правильно несколько пояснил в
#74 by ViSo76
Где ты увидел тут полиморфизм?
#75 by spock
? Поправь меня, делов-то.
#76 by Тролль главный
вот тут и наследование и полиморфизм в каком-то смысле:
#77 by woww
В 1с динамика там все функции изначально полиморфны. Так как проверки типов нету. И по этому интерфесы не нужны. Интерфейсы нужны язычкам в которых типы проверяются на этапе компиляции, а не в рантайме.
#78 by ViSo76
В общем представьте массив разных объектов ( circle, point, square ) порождённых от shape. В прототипе shape есть обязательно перегружаемая процедура show. Так вот идём по массиву и приводим получаемый элемент к базовому объекту и вызываем у них перегруженную функцию show. Это и будет полиморфизмом. То что переменные разных типов, так сам 1С не типизирован, и все переменные там Variant
#79 by spock
+75 Я понял в чем неточность. Конечно же прикладные классы "Круг" и "Квадрат" являются наследниками абстрактного класса "Фигуры".
#80 by spock
Это будет делегатом.
#81 by Рэйв
Делегат - это указатель на функцию.Вряд ли будет делегатом:-)
#82 by ViSo76
Делегат это объект который содержит в себе вызов или батарею вызовов, а полиморфизм это изменение типа класса, тапа как хамелеон. И всё это связано лишь с тем что полиморфизм нужен лишь для типизированных языков.
#83 by Лефмихалыч
>полиморфизм - изменение поведения функций (методов) подтипа по сравнению с базовым поведением чааво?..
#84 by spock
Делегат - это указатель на класс, реализующий в себе массив указателей на функции(ю).
#85 by Рэйв
Все равно вряд ли будет:-)
#86 by spock
Читаем буквально "...массив разных объектов ( circle, point, square ) порождённых от shape..." + "идём по массиву... и вызываем ...show...".
#87 by Тролль главный
таво в базовом метод выдавал "Му-му", переопределяешь и получаешь "Тра-та-та"
#88 by Лефмихалыч
+ какое в пень " поведение"? вот, на мой взгляд, отличное определение: "Если говорить кратко, полиморфизм — это способность обьекта использовать методы производного класса, который не существует на момент создания базового" ты бредишь
#89 by woww
Ну не только для языков со статической типизацией. С хорошим полиморфизмом гораздо удобнее работать и в динамике. Ведь удобно когда  метод определяется не только проверкой типа, а еще может проверяет значение типа. Такое таким язычкам как C#, java и не снилось.
#90 by Dotoshin
Все достаточно просто. Класс наследник получает от класса родителя все его свойства и методы так сказать по умолчанию, то есть есть все эти свойства будут присутствовать у наследника уже при "рождении" - это наследование. А полиморфизм - это многократное описание одного и того же метода для разных случаев. При этом не важно был этот метод унаследован или был описан "с нуля". Например класс может иметь метод "сложить", в зависимости от типа параметров он будет действовать по разному. Получит на входе две строки - на выходе будет конкатенация этих строк. Получит два числа - на выходе будет сумма чисел. Ну и т.д.
#91 by Тролль главный
не, это ты тупишь
#92 by Рэйв
Как ни жаль но он прав. Если стоит overload в ролительстком, то в наследуемом классе можешь написать там что угодно.
#93 by Лефмихалыч
"му-му" и "тра-та-та"
#94 by Локи-13
я тоже хотел на хабр сослаться (
#95 by Dotoshin
Все правильно в сказано. Может существовать класс с абстрактным методом - это как бы базовое поведение, а в классах наследниках будет описано поведение этого метода для разных типов параметров.
#96 by Лефмихалыч
к полиморфизму это каким боком? Это наследование, точнее возможности управления наследованием в разных языках. Полиморфизм - это когда ты делаешь один метод с неким поведением относительно базового класса и в него можшь передавать любых потомков этого базового класса
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С