Перегрузка методов
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 50 из 70.
Перегрузка методов позволяет определять несколько методов с одним и тем же именем, но разными списками параметров. Компилятор определяет, какую версию вызвать, на основе предоставленных вами аргументов.
Каждый перегруженный метод должен иметь уникальную сигнатуру — либо разное количество параметров, либо разные типы параметров:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}// Компилятор выбирает правильную версию
Print("Hello"); // Вызывает Print(string)
Print("Hi", 3); // Вызывает Print(string, int)
Print(42); // Вызывает Print(int)Перегрузка отличается от необязательных параметров важным аспектом. При использовании необязательных параметров у вас есть один метод, который обрабатывает несколько сценариев. При перегрузке у вас есть отдельные методы, которые могут содержать совершенно разную логику для каждого случая.
Обратите внимание, что один только тип возвращаемого значения не делает методы уникальными — у вас не может быть двух методов, которые различаются только тем, что они возвращают. Список параметров должен быть разным. Перегрузка методов — это форма полиморфизма времени компиляции, при которой решение о том, какой метод вызвать, принимается во время компиляции кода, а не во время его выполнения.
Задание
ЛегкоДавайте создадим универсальный класс калькулятора, который демонстрирует возможности перегрузки методов. Вы создадите несколько версий методов вычисления для обработки различных сценариев — от простых операций с двумя числами до более сложных вычислений — при этом все они будут иметь одинаковые интуитивно понятные имена методов.
Вы организуете свой код в двух файлах:
Calculator.cs: Создайте классCalculatorв пространстве именMathToolsс перегруженными методами, которые имеют одинаковые имена, но принимают разные параметры:Multiply— создайте три перегруженные версии:- Одна принимает два параметра типа
intи возвращает их произведение какint - Одна принимает три параметра типа
intи возвращает их произведение какint - Одна принимает два параметра типа
doubleи возвращает их произведение какdouble
- Одна принимает два параметра типа
Describe— создайте две перегруженные версии:- Одна принимает
intи возвращает"Integer: {value}" - Одна принимает
doubleи возвращает"Double: {value}"
- Одна принимает
Program.cs: В основном файле создайте экземплярCalculatorи продемонстрируйте, как компилятор автоматически выбирает нужный перегруженный метод на основе предоставленных вами аргументов.
Вы получите четыре входных значения:
- Первое целое число (например,
5) - Второе целое число (например,
4) - Третье целое число (например,
3) - Десятичное число (например,
2.5)
Используя свой калькулятор, выполните следующие операции и выведите каждый результат на новой строке:
- Умножьте первые два целых числа (используется версия с двумя int)
- Умножьте все три целых числа (используется версия с тремя int)
- Умножьте первое целое число и десятичное число (используется версия с двумя double)
- Опишите первое целое число (используется версия с int)
- Опишите десятичное число (используется версия с double)
Например, если входные данные — 5, 4, 3 и 2.5, вывод должен быть следующим:
20
60
12.5
Integer: 5
Double: 2.5Обратите внимание, как вы вызываете Multiply и Describe с разными типами и количеством аргументов, но компилятор точно знает, какую версию использовать в каждом случае. Это полиморфизм на этапе компиляции в действии — решение принимается во время компиляции кода, а не во время его выполнения!
Шпаргалка
Перегрузка методов позволяет определять несколько методов с одним и тем же именем, но разными списками параметров. Компилятор определяет, какую версию вызвать, на основе предоставленных аргументов.
Каждый перегруженный метод должен иметь уникальную сигнатуру — либо разное количество параметров, либо разные типы параметров:
public static void Print(string message)
{
Console.WriteLine(message);
}
public static void Print(string message, int times)
{
for (int i = 0; i < times; i++)
Console.WriteLine(message);
}
public static void Print(int number)
{
Console.WriteLine(number);
}
// Компилятор выбирает правильную версию
Print("Hello"); // Вызывает Print(string)
Print("Hi", 3); // Вызывает Print(string, int)
Print(42); // Вызывает Print(int)Ключевые моменты о перегрузке методов:
- Перегрузка отличается от необязательных параметров — при перегрузке у вас есть отдельные методы, которые могут содержать совершенно разную логику для каждого случая
- Один только тип возвращаемого значения не делает методы уникальными — список параметров должен отличаться
- Перегрузка методов — это форма полиморфизма времени компиляции, когда решение о том, какой метод вызвать, принимается во время компиляции кода, а не во время его выполнения
Попробуйте сами
using System;
using MathTools;
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
int firstInt = Convert.ToInt32(Console.ReadLine());
int secondInt = Convert.ToInt32(Console.ReadLine());
int thirdInt = Convert.ToInt32(Console.ReadLine());
double decimalNum = Convert.ToDouble(Console.ReadLine());
// TODO: Создайте экземпляр Calculator
// TODO: Вызовите Multiply с двумя целыми числами и выведите результат
// TODO: Вызовите Multiply с тремя целыми числами и выведите результат
// TODO: Вызовите Multiply с первым целым числом и десятичным числом, выведите результат
// TODO: Вызовите Describe с первым целым числом и выведите результат
// TODO: Вызовите Describe с десятичным числом и выведите результат
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов