Menu
Coddy logo textTech

Перегрузка методов

Часть раздела Объектно-ориентированное программирование путешествия по 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)

Перегрузка отличается от необязательных параметров важным аспектом. При использовании необязательных параметров у вас есть один метод, который обрабатывает несколько сценариев. При перегрузке у вас есть отдельные методы, которые могут содержать совершенно разную логику для каждого случая.

Обратите внимание, что один только тип возвращаемого значения не делает методы уникальными — у вас не может быть двух методов, которые различаются только тем, что они возвращают. Список параметров должен быть разным. Перегрузка методов — это форма полиморфизма времени компиляции, при которой решение о том, какой метод вызвать, принимается во время компиляции кода, а не во время его выполнения.

challenge icon

Задание

Легко

Давайте создадим универсальный класс калькулятора, который демонстрирует возможности перегрузки методов. Вы создадите несколько версий методов вычисления для обработки различных сценариев — от простых операций с двумя числами до более сложных вычислений — при этом все они будут иметь одинаковые интуитивно понятные имена методов.

Вы организуете свой код в двух файлах:

  • 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)

Используя свой калькулятор, выполните следующие операции и выведите каждый результат на новой строке:

  1. Умножьте первые два целых числа (используется версия с двумя int)
  2. Умножьте все три целых числа (используется версия с тремя int)
  3. Умножьте первое целое число и десятичное число (используется версия с двумя double)
  4. Опишите первое целое число (используется версия с int)
  5. Опишите десятичное число (используется версия с 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 с десятичным числом и выведите результат
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование