Поясніть що таке поліморфізм простими словами

Ок. Поліморфізм ні в якому разі не можна розглядати окремо від інших фундаментальних понять - абстракція, інкапсуляція і успадкування. Об'єкт і подібні додаються з аксіом (хоча це щось теж аксіоми).

Власне, уявімо собі поруч склянку, кухоль, чайник, кавоварку, велосипед і скейт. Що між ними всіма спільного? Ну як мінімум те, що вони є. Тобто це - об'єкти, які були створені. Але як вони були створені? Швидше за все на заводі виробника по кресленнях. Ок, чертежём назвемо конструктор. Ну а клас? А що це таке? А його немає в нашій всесвіту - ця сутність є абстракція, що живе лише в наших думках. У реальному світі її немає і ніколи не буде, така вже фізика - їй по барабану, що птахи та ссавці мають далеких родичів - Вона лише забезпечує можливість естесственного відбору. А вже родичів один одному знаходимо ми, люди.

З об'єктами і класами розібралися, а що ж там з нашими склянками та велосипедами. Ми вже зрозуміли, що все це об'єкт, тобто грубо можна все об'єкти успадковувати від якогось суперпредка, суперкласу, що і реалізовано в деяких мовах. Але що іншого спільного між ськейтом і склянкою, наприклад? Звичайно, можна заглиблюватися і вважати, що вони все з молекул, і вони все із твердих речовин. Однак це все маячня і СПГС. так що відповідь проста - так нічого. Тобто це абсолютно різні об'єкти з абсолютно різним функціоналом. Більш того - звичайно комп'ютерні моделі і ієрархії будуть сильно відрізняться від фізик і хімій. І це нормально, питання про адекватність моделей ставитися лише коли модель неадекватна, а до тих пір пиляти можна що завгодно, лише б працювало.

Ось. У нас є супер-предок Object, від якого дефолтного успадковуються всі об'єкти. Припустимо, то що об'єкти складаються з атомів і є те, що успадковують всі об'єкти. Але всі додатки і правки - поліморфізм. Так, з атомів ми зліпили колеса і приробили на дошку - ок, це скейт. На нього можна встати і котитися, а сильно викрутившись і політати в трьох метрах над землею, прямо таки випромінюючи своє яскраве его. У той час як склянка - це ми зліпили з атомів щільну ємність, з якої вода не виливається під дією сили тяжіння. І пряме застосування склянки - налив води перехилити його над ротом, щоб вода витекла прямо в шлунок. Так роблять справжні пацани, не піклуючись про гикавці або страху потонути, так що ось - поліморфізм.

Однак що з рештою? У нас ще абстракція, інкапсуляція і успадкування. Ок, почнемо з успадкування, так воно найближче. Ось що у нас спільного між склянкою і кухлем? Ну в обидва можна налити воду, але у гуртки є ручка щоб триматися. Тобто можна придумати якийсь загальний клас - ємність. Однак що це за класс? Можна наприклад за цей клас взяти склянку, тоді все ємності по дефолту склянки, а все інше - видозмінені склянки. Але комусь більше подобаються глечики, наприклад деякі чики насят їх на голові, вважаючи що це зручно. Ну і нехай носять, але якось же вирішити треба, що найголовніше і найкраще. Так ось - недостяжімий ідеал і є головний - це називається абстрактний клас. Тобто ємність, що неможливо створити, для якого немає повного креслення. А все креслення, що доповнили до повного - є успадковані класи від класу ємність.

Тут ми підійшли до абстракції. Ось таке ієрархічне спадкування призводить нас до, можливо головною, ідеї ООП. Ось ми взяли та виділили все, куди можна налити воду в окремий клас, намалювали загальний креслення, але спеціально не доробили його, залишивши зазор для майбутніх митців, і назвали креслення - ємність. Тисячі років ізобретатілі всіх світів створюють свої ємності, одна краща за іншу. Для різних людей - по різному, звичайно. Але кожен раз групувати молекули скла певним чином - непроста задача. Тому ремісники пішли на хитрість, вони створили таємний рада ремісників світу і вирішили ділитися один з одним своїми напрацюваннями. Тобто створювати дрібні креслення і оголошувати класом, наприклад, ізвлістой ручки у формі стрічки Мебіуса, наприклад. Можливо така ручка зручно тільки інопланетним істотам, але креслення створений і до нього можна посилатися при створенні свого креслення. Таким чином ми абстрагуємося від низкоуровневой завдання "формування ємностей допомогою переміщення молекул" до "конструювання ємності за допомогою поєднання деталей, елементів". Це і є абстракція.

Але ми підійшли до останнього пункту - інкапсуляція. Вона нерозривна з абстракцією, і по суті завдяки їй вона і працює. Інкапсуляція - це своеборазний клей (або синя ізолента), яким склеюють різні креслення в один. Тобто суміщення деталей для створення своєї - це і є інкапсуляція. Причому при суміщенні ми можемо не описувати деталі цього поєднання (тобто члени класу можуть бути приватними), таким чином допомагаючи абстрагуватися тим, хто цей креслення використовує. Ось подивимося на чайник - що це таке? Це стакан (або гуртка) до якого знизу (а може усередині по середині?) Приклеєний нагрівальний елемент. Пустивши по ньому струм, згідно Інкапсульована в нагрівальний елемент закону Ома, буде виділятися тепло і нагріватися вода. А кавоварка? Це куди більш складний пристрій, з безліччю насосів, ємностей, шлюзів, подрібнювачів і чайників. І все склеєних клеєм. А може синьою ізоляційною стрічкою. Це знову інкапсуляція.

Таким чином, абстракція неможлива без інкапсуляції і успадкування, як неможливий поліморфізм без, власне, успадкування. Ну а поліморфізм неможливий ще й без інкапсуляції, яка банально марна без успадкування та поліморфізму. Ось такі тут трикутники з пирогами. Шкода тільки про пиріг набрехали. І про день народження.

Поліморфізм вказує, скільки разів методу поточного об'єкта запустити.
Наприклад, у вас є кілька успадкованих класів з різною реалізацією одного і того ж методу. Тобто, у вас є кілька різних методів з однаковим ім'ям (і сигнатурою), реалізованих в різних класах. Яку версію методу викликати? Це залежить від типу змінної, в якій знаходиться об'єкт.
Також за допомогою поліморфізму можна помістити об'єкти різних класів в один масив з типом базового класу.

Створимо три класи з двома методами - один віртуальний, а інший ні. Віртуальний метод перевизначений (override) в класах-спадкоємців. Невіртуальний метод просто прихований в спадкоємців нової реалізацією (невіртуальні не можна перевизначати).

При створенні об'єкта важливо, в змінну якого типу об'єкт буде записаний:


А тепер часта ситуація, коли поліморфізм потрібен - при ітерації масиву:

Спадкування без віртуальних методів корисний тільки фіксацією інтерфейсу.

Ось весь код прикладу: code.re/5ZC
Вставте його ось сюди і перевірте.

Є 4 класу - клас Точка, абстрактний Фігура, від якої успадковуються Коло і Прямокутник

Поясніть що таке поліморфізм простими словами

> 1. Number.prototype.toString () і Object.prototype.toString () - це поліморфізм чи ні?
Ні, то що ви написали - НЕ поліморфізм, це методи у вбудованих об'єктах мови. Некоректне запитання. У класу Number своя реалізація toString, відмінна від Object. Якщо викликати toString у об'єктів різних класів, то буде поліморфізм.
Якщо метод toString реалізувати в своєму клас, то це і буде використанням поліморфізму. Наприклад, якщо сторонній код приймає різні об'єкти і викликає у них цей метод для своїх цілей, то це буде проявом поліморфізму.

> 2. Date.prototype.hasOwnProperty () і Object.prototype.hasOwnProperty () - це спадкування чи ні?
Знову ж таки, це просто методи, так їх ніхто не викликає. Так як в класі Date немає своєї реалізації методу hasOwnProperty, то він успадковується з Object. Так що так - цей успадкування.

Поясніть що таке поліморфізм простими словами

Ось метод fromCharCode реалізований в самому конструкторі String. Але цей метод називається статичним і він може бути викликаний безпосередньо у конструктора. У будь-якого рядка цей методи викликати неможливо. Тому оскільки він розглядався питання така реалізація не має відношення.

Ви оперуєте поняттями «клас» і «метод класу», хоча потрібно використовувати «прототип» і «конструктор».

Саме так і зроблено по відношенню до toString в прототипі конструктора Number. Так що ще раз запитаю:
Number.prototype.toString () і Object.prototype.toString () - цей поліморфізм чи ні?

Знову ж таки, це просто методи, так їх ніхто не викликає
Та ну?)) А ми-то не знали. Цей метод (а не методи) викликаються в кожному створеному об'єкті саме тому, що реалізовані вони в прототипі.

Поясніть що таке поліморфізм простими кажучи

@lexxpavlov немає, я не вважаю, що ви помилилися, інакше написав би саме це :) Поясню свою позицію:

2) Терміни на кшталт «віртуального методу» вимагають пояснень. Я і написав про різні реалізації методів, тому що не зрозумів - а що ви має на увазі?

@Petroveg Добре, давайте я так скажу.
У статичних мовах є два види методів - звичайні і віртуальні. Поліморфізм в них працює тільки на віртуальних. Що таке віртуальні - я спробував пояснити у своїй відповіді.
У динамічних мовами "звичайних" методів немає - є тільки ті, які в статичних називаються віртуальними.

> 1) Реалізація інкапсуляції, успадкування та поліморфізму в кожній мові відрізняється
Вірно. Саме тому потрібно (потрібно!) Розуміти загальні принципи, а не їх реалізації в конкретній мові. Я, як викладач, постарався показати більш загальний принцип, і вказав, що в конкретній мові це реалізується так-то (згоден, що перехід від загального до js я погано показав - зараз зроблю апдейт до своєї відповіді).

> 2) Терміни на кшталт «віртуальної методу» вимагають пояснень.
Вимагають. Я спробував пояснити їх у своїй відповіді, але, здається, погано. Знову ж - см. Апдейт.

Поясніть що таке поліморфізм простими словами

@lexxpavlov як викладач викладачеві скажу, що іноді не потрібно розповідати повну картину на всю глибину. Можна коротко, давши посилання теорію і на інші реалізації. Уявіть, якщо ви в XV столітті розповідали б про теорію радіотелескопів і адаптивної оптики на питання «Чому ці світлі точки на небі не рухаються?».

У цьому вашій відповіді все ясно і чітко, і я б на місці слухача зрозумів, що тут одна картина, а при вивченні того ж C # потрібно дивитися на ці ж питання в іншому світлі.