Урок 6. Перегрузка метода C#


Шестой урок в учебнике по объектно-ориентированному программированию на C# объясняет перегрузку методов. Этот способ позволяет объявлять несколько методов, используя одно и то же имя, но с разными параметрами. Перегрузка метода - наш первый взгляд на полиморфизм.

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

Одной из ключевых особенностей объектно-ориентированного программирования является полиморфизм. Полиморфизм позволяет объектам вести себя по-разному в зависимости от способа их использования. Одной из частей полиморфизма является способность метода вести себя по-разному в соответствии с типами и количеством параметров, которые ему передаются. Это достигается за счет перегрузки метода.

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

Одним из величайших преимуществ перегрузки методов является улучшение, которое он обеспечивает читабельности и удобству сопровождения кода. В языках, которые не поддерживают эту технику или опциональные операнды, новый метод должен быть создан для каждой возможной комбинации параметров. Например, в языке программирования ANSI C для усечения значения вы бы использовали trunc, truncf или truncl в соответствии с округляемым типом данных. В C# перегрузка методов позволяет всегда вызывать Math.Truncate. Это становится еще более полезным, когда изменение требований программы означает изменение типов данных. В отличие от более старых языков, метод усечения C # не требует модификации кода.

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

Создание перегруженного метода

Создание перегруженного метода достигается простым добавлением двух или более методов с одинаковыми именами в класс. Методы могут быть нормальными или статическими. Пока сигнатуры методов различаются, код будет компилироваться правильно. В следующем примере мы создадим метод, который вычисляет квадрат числа, используя разные типы данных. Для начала создайте новое консольное приложение и добавьте новый файл класса с именем «Calculate». Добавьте следующий код в новый класс:

class Calculate
{
    public static int Square(int number)
    {
        Console.WriteLine("Integer Square calculated");
        return number * number;
    }
}
Новый метод вычисляет квадрат целочисленного значения. Команда Console.WriteLine включена, чтобы мы могли легко видеть ход выполнения. Чтобы проверить расчет, измените метод Main программы следующим образом и запустите программу, чтобы увидеть результаты.

static void Main(string[] args)
{
    int squareMe = 5;
    Console.WriteLine(Calculate.Square(squareMe));
}
 /* Вывод Integer Square calculated25 */
Программа берет целочисленное значение и возводит его в квадрат, используя статический метод Square класса Calculate, что дает правильный результат двадцать пять. Однако если тип данных квадрата будет изменен, результат может отличаться. Если вы измените метод Main таким образом, чтобы квадратная переменная представляла собой double, код больше не будет компилироваться, поскольку тип данных double не может быть неявно приведен к целому числу.

static void Main(string[] args)
{
    double squareMe = 5;                            // не компилируется
    Console.WriteLine(Calculate.Square(squareMe));
}
Для поддержки двойного типа данных (double) мы можем добавить второй вариант метода в класс Calculate. Этот перегруженный метод будет принимать и возвращать двойные, а не целые числа. Добавьте новый метод следующим образом:

public static double Square(double number)
{
    Console.WriteLine("Double Square calculated");
    return number * number;
}
Теперь, когда класс Calculate может возводить в квадрат целые и двойные числа, измените метод Main следующим образом и выполните программу. Вы можете видеть, что компилятор правильно определяет, какой из перегруженных методов выполнять для каждого вызова Calculate.Square.

static void Main(string[] args)
{
    double squareMe = 5;
    int squareMeToo = 5;
    Console.WriteLine(Calculate.Square(squareMe));
    Console.WriteLine(Calculate.Square(squareMeToo));
}
 
/* Вывод
 
Double Square calculated
25
Integer Square calculated
25
 
*/
Автоматическое преобразование типов

В приведенном выше примере был создан второй вариант метода, потому что мы хотели заключить в квадрат double, и это не могло быть неявно приведено к целому числу. Однако там, где возможно неявное приведение, компилятор выполнит это преобразование автоматически. В следующем примере метод Main обновляется для использования float. Как видите, поскольку перегруженного метода не существует специально для чисел с плавающей запятой, вместо него используется двойной вариант.

static void Main(string[] args)
{
    float squareMe = 5;
    Console.WriteLine(Calculate.Square(squareMe));
}
 
/*
 
Double Square calculated
25
 
*/
Ограничения возвращаемого типа

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

class Calculate
{
    public static int Square(double number)
    {
        return (int)(number * number);
    }
 
    public static double Square(double number)
    {
        return number * number;
    }
}
Примечание по ссылочным параметрам

Если параметры передаются по ссылке, они считаются отличными от тех, которые передаются по значению. Это означает, что допустимо иметь перегруженный метод с тем же набором типов данных параметров, если одна версия передает параметры по значению, а другая - по ссылке.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, ООП




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




VirtualBox и Ubuntu: советы
Опасность готовых скриптов для сайта
Проблема с датами на JavaScript в айфоне, сафари и IE