Практическая работа №7
Тема: Конструктор класса. Перегрузка методов класса
Цель работы: изучить концепцию конструкторов класса в C#, их назначение и различные типы.
Теоретические сведения
Иногда возникает необходимость создать один и тот же метод, но с разным набором параметров. И в зависимости от имеющихся параметров применять определенную версию метода. Такая возможность еще называется
перегрузкой методов.
В языке C# мы можем создавать в классе несколько методов с одним и тем же именем, но разной сигнатурой. Что такое сигнатура?
Сигнатура метода – это часть объявления метода, которая позволяет компилятору идентифицировать метод среди других.
Сигнатура складывается из следующих аспектов:
Имя метода
Количество параметров
Типы параметров
Порядок параметров
Модификаторы параметров
Для чего использовать перегрузку методов
Перегрузка используется для создания универсальных методов, логика поведения которых одинакова, но типы данных или количество аргументов разное. Это дает возможность писать красивый код, группируя методы с
одинаковым поведением по имени.
Но названия параметров в сигнатуру НЕ входят. Например, возьмем следующий метод:
public int Sum(int x, int y)
{
return x + y;
}
У данного метода сигнатура будет выглядеть так: Sum(int, int)
Исходя из понятия сигнатуры, перегруженными называют методы, которые отличаются сигнатурами, но при этом имеют одинаковые имена.
То есть методы должны отличаться по:
Количеству параметров
Типу параметров
Порядку параметров
Модификаторам параметров
Например, пусть у нас есть следующий класс:
class Calculator
{
public void Add(int a, int b)
{
int result = a + b; Console.WriteLine($"Result is {result}");
}
public void Add(int a, int b, int c)
{
int result = a + b + c; Console.WriteLine($"Result is {result}");
}
public int Add(int a, int b, int c, int d)
{
int result = a + b + c + d; Console.WriteLine($"Result is {result}"); return result;
}
public void Add(double a, double b)
{
double result = a + b; Console.WriteLine($"Result is {result}");
}
Здесь представлены четыре разных версии метода Add, то есть определены четыре перегрузки данного метода.
Первые три версии метода отличаются по количеству параметров. Четвертая версия совпадает с первой по количеству параметров, но отличается по их типу. При этом достаточно, чтобы хотя бы один параметр отличался по типу. Поэтому это тоже допустимая перегрузка метода Add.
То есть мы можем представить сигнатуры данных методов следующим образом:
Add(int, int) Add(int, int, int)
Add(int, int, int, int) Add(double, double)
После определения перегруженных версий мы можем использовать их в программе:
Calculator calc = new Calculator();
calc.Add(1, 2); // 3
calc.Add(1, 2, 3); // 6
calc.Add(1, 2, 3, 4); // 10
calc.Add(1.4, 2.5); // 3.9
Консольный вывод:
Также перегружаемые методы могут отличаться по используемым модификаторам. Например:
void Increment(ref int val)
{
val++; Console.WriteLine(val);
}
void Increment(int val)
{
val++; Console.WriteLine(val);
}
В данном случае обе версии метода Increment имеют одинаковый набор параметров одинакового типа, однако в первом случае параметр имеет модификатор ref. Поэтому обе версии метода будут корректными
перегрузками метода Increment.
Задание
Максимальное из трех чисел
Написать программу, для определения максимального из трех вещественных чисел, которые вводятся с клавиатуры, используя перегрузку метода для поиска максимального из двух значений.
Умножение чисел
Напишите перегруженные методы, в сокращенной форме(лямбда), которые принимают на вход два целых числа, находят их произведение и в зависимости от типа прибавляют к результату: 1 – для uint, 2 – для int, 3 – для long.
Контрольные вопросы:
Что такое конструктор класса?
Как объявить конструктор с параметрами?