Public Function AddDoubles(ByVal x As Double, ByVal y As Double) As Double
AddDoubles = x + y
End Function
Public Function AddLongs(ByVal x As Long, ByVal y As Long) As Long
AddLongs = x + y
End Function
Такой код не только становится трудным в сопровождении, но и заставляет помнить имена всех методов. Применяя перегрузку, вызывающему коду можно предоставить возможность обращения к единственному методу по имени Add
На заметку!
Как будет объясняться в главе 10, существует возможность построения обобщенных методов, которые переносят концепцию перегрузки на новый уровень. Используя обобщения, можно определять заполнители типов для реализации метода, которая указывается во время его вызова.Чтобы попрактиковаться с перегруженными методами, создайте новый проект консольного приложения по имени FunWithMethodOverloading
AddOperations.cs и приведите его код к следующему виду:namespace FunWithMethodOverloading {
// Код С#.
// Overloaded Add method.
public static class AddOperations
{
// Перегруженный метод Add.
public static int Add(int x, int y)
{
return x + y;
}
// Перегруженный метод Add.
public static double Add(double x, double y)
{
return x + y;
}
// Перегруженный метод Add.
public static long Add(long x, long y)
{
return x + y;
}
}
}
Замените код в Program.cs
using System;
using FunWithMethodOverloading;
using static FunWithMethodOverloading.AddOperations;
Console.WriteLine("***** Fun with Method Overloading *****\n");
// Вызов версии int метода Add
Console.WriteLine(Add(10, 10));
// Вызов версии long метода Add с использованием нового
// разделителя групп цифр
Console.WriteLine(Add(900_000_000_000, 900_000_000_000));
// Вызов версии double метода Add
Console.WriteLine(Add(4.3, 4.4));
Console.ReadLine;
На заметку!
Операторusing static будет раскрыт в главе 5. Пока считайте его клавиатурным сокращением для использования методов, содержащихся в статическом классе по имени AddOperations из пространства имен FunWithMethodOverloading.В операторах верхнего уровня вызываются три разных версии метода Add
Среды Visual Studio и Visual Studio Code оказывают помощь при вызове перегруженных методов. Когда вводится имя перегруженного метода (такого как хорошо знакомый метод Console.WriteLine
Если перегруженная версия принимает необязательные параметры, тогда компилятор будет выбирать метод, лучше всего подходящий для вызывающего кода, на основе именованных и/или позиционных аргументов. Добавьте следующий метод:
static int Add(int x, int y, int z = 0)
{
return x + (y*z);
}
Если необязательный аргумент в вызывающем коде не передается, то компилятор даст соответствие с первой сигнатурой (без необязательного параметра). Хотя существует набор правил для нахождения методов, обычно имеет смысл избегать создания методов, которые отличаются только необязательными параметрами.
Наконец, in
ref и out не считаются частью сигнатуры при перегрузке методов, когда используется более одного модификатора. Другими словами, приведенные ниже перегруженные версии будут приводить к ошибке на этапе компиляции:static int Add(ref int x) { /* */ }
static int Add(out int x) { /* */ }
Однако если модификатор in
ref или out применяется только в одном методе, тогда компилятор способен проводить различие между сигнатурами. Таким образом, следующий код разрешен:static int Add(ref int x) { /* */ }
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT