На цьому уроці ми розглянемо з вами ще один спосіб реалізації поліморфізму в Сі-шарп - перевантаження методів.
Перевантаження методів - це оголошення в класі методів з однаковими іменами при цьому з різними параметрами.
Маючи якийсь метод, щоб його перевантажити, інший метод з таким же ім'ям повинен відрізнятися від нього кількістю параметрів та / або типами параметрів. Відмінності тільки типами повертаються значень методами недостатньо для перевантаження, але якщо методи відрізняються параметрами, тоді перенавантажувані методи можуть мати і різні типи повертаються значень.
Приклад того, як може бути перевантажений метод:
public void SomeMethod ()
{
// Тіло методу
}
public void SomeMethod (int a) // від першої відрізняється наявністю параметра
{
// Тіло методу
}
public void SomeMethod (string s) // від другого відрізняється типом параметра
{
// Тіло методу
}
public int SomeMethod (int a, int b) // від попередніх відрізняється кількістю параметрів (плюс змінено тип повернення)
{
// Тіло методу
return 0;
}
Приклад того, як не може бути перевантажений метод:
public void SomeMethod (int a)
{
// Тіло методу
}
public void SomeMethod (int b) // імені параметра недостатньо
{
// Тіло методу
}
public int SomeMethod (int a) // типу значення, що повертається недостатньо
{
// Тіло методу
return 0;
}
Ми з вами вже стикалися з перевантаженням методів на практиці в уроці Конструктори в Сі-шарп, коли створювали кілька конструкторів - без параметрів і з параметрами.
На практиці перевантаження методів в Сі-шарп зустрічається на кожному кроці. Наприклад, у класі для конвертації типів Convert перевантажені майже всі методи. Метод ToInt32 () може приймати параметр різного типу - bool, float, double, byte, char і т.д. Для кожного варіанту параметра методу необхідна своя реалізація конвертації відповідно, тут і використовується перевантаження методу ToInt32 (). Цей приклад дуже добре показує перевага, яку дає нам перевантаження - ми просто викликаємо метод з універсальним ім'ям ToInt32 (), не замислюючись параметр якого типу ми передаємо. Без перевантаження цей метод міг би розділитися на методи з різними іменами: FromBoolToInt32 (), FromFloatToInt32 (), FromDoubleToInt32 (), FromByteToInt32 () і т.д.
Наведу ще простий приклад перевантаження. Метод буде додавати аргументи один до одного і виводити результат (з числами це звичайне додавання, з символами об'єднання в рядок):
public static void AddAndDisplay (int a, int b)
{
Console.WriteLine (a + b);
}
public static void AddAndDisplay (char a, char b)
{
Console.WriteLine (a.ToString () + b.ToString ());
}
static void Main (string [] args)
{
AddAndDisplay (5, 8); // 13
AddAndDisplay ('C', '#'); // "C #"
Console.ReadKey ();
}
Ми просто задаємо параметри методу, а компілятор сам вирішує, який варіант методу AddAndDisplay необхідно викликати.
Домашнє завдання
Маємо список імен. Створіть метод, який буде виводити на екран ці імена через кому. Перевантажите цей метод так, щоб можна було змінювати роздільник - замість ком між іменами будь-який символ, переданий параметром.
PS. Не забудьте поділитися з друзями цим уроком за допомогою кнопок соціальних мереж.