Чи є перевантаження методів поліморфізмом stack overflow російською

І так і ні. Дивлячись що вони мають на увазі під поліморфізмом.

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

До цього поліморфізму перевантаження методів відноситься самим прямим чином: це ad-hoc поліморфізм для функції: в неї можна передавати різні типи (в межах реалізованих перевантажень) і при цьому буде виконано різний код. (А методи об'єктів класів можна розглядати, як функції з додатковим неявним аргументом: об'єктом, у якого метод викликається [this в Шарп].)

Може виникнути закономірне питання: чи не є тоді різні перевантаження різними функціями, не ламається при цьому відповідність визначенню поліморфізму? Відповідь: поліморфізм існує на рівні мови. і якщо в мові перевантаження з однаковими назвами, але різними типами, вважаються однією і тією ж функцією, то визначення дотримано і все ок.

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

В ООП ж під поліморфізмом зазвичай розуміють набагато більш вузьке поняття: можливість викликати один і той же метод у будь-якого об'єкта заданого класу / інтерфейсу або будь-якого його підкласу / реалізації.

До цього поліморфізму перевантаження дійсно не має відношення.

(* Ad hoc, лат, ситуаційно, на даний випадок)

Традиційно, в ООП співтоваристві "поліморфізмом" прийнято називати тільки різновид поліморфізму пов'язану з підтипами. При цьому в ФП співтоваристві "поліморфізмом" називають параметричний поліморфізм. Вікіпедія призводить три види поліморфізму в CS - ad hoc, параметричний і підтипи. Втім інші джерела можуть пропонувати інше розподіл.

Терміни "статичний" і "динамічний" поліморфізм застосовні тільки до конкретної реалізації конкретного мови, зокрема в мові з динамічною типізацією перевантаження функцій може бути реалізована під час роботи програми.

відповідь дан 23 Листопада '16 о 13:48

@DenisBubnov C # підтримує і ФП, і ООП і інші парадигми. - Abyx 23 Листопада '16 о 14:18

@DenisBubnov, а мені здається що правильний. Адже поняття поліморфізм існує як у багатьох мовах, так і в програмуванні зокрема. В усіх мовах і парадигмах різний поліморфізм і тому коли будуть говорити два програміста однієї мови, але різних парадигм то може виникнути не розуміння. А чого вже говорити про суперечку програмістів з різних мов. Тому знання всього сказаного лише підуть на користь і допоможе глибше розібратися в питанні. - OlmerDale 23 Листопада '16 в 14:34

Поняття поліморфізму не має чіткого визначення, але для об'ктно-орієнтованого підходу зазвичай приймають що існує два типи поліморфізму:

Динамічний (використання віртуальних методів і їх перевизначення в класах нащадках) - в цьому випадку версія викликається коду визначається CLR на етапі виконання, проходячи по ланцюгу перевизначень в класах нащадків.

Статичний (використання узагальнень (generics)) - в цьому випадку використовується одна і таж версія коду для об'єктів різних типів.

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

З тим же результатом ми могли б додати до імені методу типи параметрів, і з точки зору архітектури додатку нічого не изменть, а полімрфізм - це, в першу чергу, інструмент архітектурного підходу до вирішення завдань.

Поліморфізм буває різним. Зокрема, статичним і динамічним.

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

Так що тут вся справа в термінології. Можливо Ваші колеги під поліморфізмом мають на увазі виключно динамічний.

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

Розглянь ось такий простий метод:

І напишемо методи, перевантажують його:

Ми перевантажили метод OverloadMethod два рази.

Що можемо побачити під час виклику методу:

Перевантаження методів підтримує властивість поліморфізму, оскільки саме таким способом в C # реалізується головний принцип поліморфізму: один інтерфейс - безліч методів.

У С # кожному методу може бути присвоєно одне і те ж ім'я. Компілятор C # сам визначає, який саме варіант методу OverloadMethod слід викликати, виходячи з типу переданого аргументу, під час виклику методу.

У C # визначено поняття сигнатури, що позначає ім'я методу і список його параметрів; Стосовно до перевантаження це поняття означає, що в одному класі не повинно існувати двох методів з однієї і тієї ж сигнатурою. Слід підкреслити, що в сигнатуру не входить тип значення, оскільки він не враховується, коли компілятор C # приймає рішення про перевантаження методу. У сигнатуру не входить також модифікатор params.

Якби C # не підтримував перевантаження, то довелося б привласнювати кожному методу своє ім'я, що не дуже зручно. В даному випадку метод OverloadMethod реалізує кілька перевантажень.

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

Поняття поліморфізму часто трактується по різному, можна побачити масу понять, але все зводиться до одного. В результаті, відповіддю на питання: Чи є перевантаження методів поліморфізмом? - я відповідаю ТАК.

Схожі статті