Керівництво c #, перевантаження методів

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

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

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

Давайте розглянемо приклад використання перевантаження методів:

Як бачите метод ui перевантажується три рази. Модифікатори параметрів ref і out також враховуються, коли приймається рішення про перевантаження методу. Незважаючи на те що модифікатори параметрів ref і out враховуються, коли приймається рішення про перевантаження методу, відмінність між ними не настільки істотно. Давайте додамо ще одне перевантаження в вищевказаний приклад:

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

Припустимо, що потрібно функція, яка визначає абсолютне значення. У мовах, що не підтримують перевантаження методів, зазвичай доводиться створювати три або більше варіантів такої функції з дещо відмінними, але все ж різними іменами. Наприклад, в С функція abs () повертає абсолютне значення цілого числа, функція labs () - абсолютне значення довгого цілого числа, а функція fabs () - абсолютне значення числа з плаваючою точкою звичайної (одинарної) точності.

В С перевантаження не підтримується, і тому у кожної функції повинно бути своє, особливе ім'я, незважаючи на те, що всі згадані вище функції, по суті, роблять одне й те саме - визначають абсолютне значення. Але це принципово ускладнює становище, оскільки доводиться пам'ятати імена всіх трьох функцій, хоча вони реалізовані по одному і тому ж основному принципу. Подібні труднощі в C # не виникають, оскільки кожному методу, який визначає абсолютне значення, може бути присвоєно одне і те ж ім'я. І дійсно, до складу бібліотеки класів для середовища .NET Framework входить метод Abs (), який перевантажується в класі System.Math для обробки даних різних числових типів. Компілятор C # сам визначає, який саме варіант методу Abs () слід викликати, виходячи з типу переданого аргументу.

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

Щоб закріпити поняття перевантаження методів, давайте розглянемо перевантаження вбудованого методу IndexOf класу String простору імен System:

Керівництво c #, перевантаження методів

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

Схожі статті