Что такое перегрузка методов c
Перейти к содержимому

Что такое перегрузка методов c

  • автор:

Что такое перегрузка методов c

Иногда возникает необходимость создать один и тот же метод, но с разным набором параметров. И в зависимости от имеющихся параметров применять определенную версию метода. Такая возможность еще называется перегрузкой методов (method overloading).

И в языке C# мы можем создавать в классе несколько методов с одним и тем же именем, но разной сигнатурой. Что такое сигнатура? Сигнатура складывается из следующих аспектов:

Но названия параметров в сигнатуру НЕ входят. Например, возьмем следующий метод:

У данного метода сигнатура будет выглядеть так: Sum(int, int)

И перегрузка метода как раз заключается в том, что методы имеют разную сигнатуру, в которой совпадает только название метода. То есть методы должны отличаться по:

Например, пусть у нас есть следующий класс:

Здесь представлены четыре разных версии метода Add, то есть определены четыре перегрузки данного метода.

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

То есть мы можем представить сигнатуры данных методов следующим образом:

После определения перегруженных версий мы можем использовать их в программе:

Также перегружаемые методы могут отличаться по используемым модификаторам. Например:

В данном случае обе версии метода Increment имеют одинаковый набор параметров одинакового типа, однако в первом случае параметр имеет модификатор ref. Поэтому обе версии метода будут корректными перегрузками метода Increment.

А отличие методов по возвращаемому типу или по имени параметров не является основанием для перегрузки. Например, возьмем следующий набор методов:

Сигнатура у всех этих методов будет совпадать:

Поэтому данный набор методов не представляет корректные перегрузки метода Sum и работать не будет .

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

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

В общем, для перегрузки метода достаточно объявить разные его варианты, а об остальном позаботится компилятор. Но при этом необходимо соблюсти следующее важное условие: тип или число параметров у каждого метода должны быть разными.

Совершенно недостаточно, чтобы два метода отличались только типами возвращаемых значений. Они должны также отличаться типами или числом своих параметров. (Во всяком случае, типы возвращаемых значений дают недостаточно сведений компилятору C#, чтобы решить, какой именно метод следует использовать.) Разумеется, перегружаемые методы могут отличаться и типами возвращаемых значений. Когда вызывается перегружаемый метод, то выполняется тот его вариант, параметры которого соответствуют (по типу и числу) передаваемым аргументам.

Давайте рассмотрим пример использования перегрузки методов:

Использование перегруженного метода C#

Как видите метод ui перегружается три раза. Модификаторы параметров ref и out также учитываются, когда принимается решение о перегрузке метода. Несмотря на то что модификаторы параметров ref и out учитываются, когда принимается решение о перегрузке метода, отличие между ними не столь существенно. Давайте добавим еще одну перегрузку в вышеуказанный пример:

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

Допустим, что требуется функция, определяющая абсолютное значение. В языках, не поддерживающих перегрузку методов, обычно приходится создавать три или более вариантов такой функции с несколько отличающимися, но все же разными именами. Например, в С функция abs() возвращает абсолютное значение целого числа, функция labs() — абсолютное значение длинного целого числа, а функция fabs () — абсолютное значение числа с плавающей точкой обычной (одинарной) точности.

В С перегрузка не поддерживается, и поэтому у каждой функции должно быть свое, особое имя, несмотря на то, что все упомянутые выше функции, по существу, делают одно и то же — определяют абсолютное значение. Но это принципиально усложняет положение, поскольку приходится помнить имена всех трех функций, хотя они реализованы по одному и тому же основному принципу. Подобные затруднения в C# не возникают, поскольку каждому методу, определяющему абсолютное значение, может быть присвоено одно и то же имя. И действительно, в состав библиотеки классов для среды .NET Framework входит метод Abs(), который перегружается в классе System.Math для обработки данных разных числовых типов. Компилятор C# сам определяет, какой именно вариант метода Abs() следует вызывать, исходя из типа передаваемого аргумента.

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

Чтобы закрепить понятие перегрузки методов, давайте рассмотрим перегрузку встроенного метода IndexOf класса String пространства имен System:

Перегрузки IndexOf C#

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

C#. Перегрузка методов в классах. Примеры. Преимущество перегрузки методов. Перегрузка конструкторов

Язык программирования C# позволяет осуществлять перегрузку методов в классе. Перегрузка означает использование одного имени для разных методов. Фактически, перегружается имя метода.

Перегрузка метода – это программная реализация нескольких методов для которых выполняются следующие условия:

  • все перегруженные методы носят одинаковое имя;
  • перегруженные методы отличаются параметрами. Точнее говоря, тип параметров или количество параметров в перегруженных методах должны отличаться.

Перегрузка метода в классе – это объявления другого метода с таким самым именем в классе но с отличаемыми параметрами. Параметры перегруженного метода должны отличаться типами или количеством.

Если вызывается перегруженный метод, то компилятор выбирает тот вариант метода, параметры которого совпадают (по типу и по количеству) с аргументами, которые передаются в метод.

2. Что такое сигнатура метода? Какие требования к сигнатуре метода с точки зрения перегрузки?

Сигнатура метода – это имя метода и список его параметров. С точки зрения перегрузки к сигнатуре метода относится следующее требование:

  • в одном классе не должно существовать двух методов с одинаковой сигнатурой.

3. Считаются ли перегруженными два метода, которые имеют одинаковые параметры но возвращают разные значения?

Нет. Это ошибка. Согласно синтаксису C# перегруженные методы обязательно должны отличаться параметрами.

4. Примеры перегруженных методов

Пример 1. В классе MaxMethods объявляется перегруженный метод Max() , имеющий 3 реализации. Метод реализует поиск максимума между разным количеством параметров типа int .

Ниже приведено использование перегруженного метода Max() класса MaxMethods

Пример 2. В классе AverageMethods объявляется метод Average(), получающий массив чисел и определяющий среднее арифметическое массива. Метод имеет 2 перегруженные реализации для типов int и float . Количество параметров в перегруженных методах Average() есть одинаковым, однако, типы параметров отличаются.

Ниже продемонстрировано использование перегруженного метода Average()

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

5. Какие особенности перегрузки методов, которые получают параметры с модификаторами ref и out ?

Если попробовать объявить разные реализации метода, который содержит одинаковые параметры отличающиеся между собой только модификаторами ref и out , то компилятор выдаст ошибку.

Например. Пусть нужно реализовать два метода GetPi() , которые возвращают число p типа double. При нижеследующем объявлении этих методов в некотором классе

и попытке компиляции, компилятор выдаст сообщение об ошибке

Это означает, что модификаторы ref и out не изменяют общую сигнатуру метода.

6. Какие преимущества дает перегрузка методов?

Перегрузка методов дает следующие преимущества:

  • нет потребности в объявлении дополнительных методов с разными (отличными) именами для выполнения похожей работы. Тем самым упрощается и уменьшается код программы, что в свою очередь ведет к повышению читабельности программы;
  • реализуется основной принцип полиморфизма – один интерфейс, много методов. Это есть удобным, когда идет обращение по одному имени к методу, а компилятор в зависимости от параметров сам выбирает какую реализацию метода выполнить;
  • обеспечивается удобный доступ к связанным вместе методам на основе общего имени;
  • перегруженные методы могут выполнять абсолютно разную работу, то есть иметь абсолютно разный программный код. Все это зависит от получаемых параметров. Однако, желательно (рекомендуется), чтобы перегруженные методы выполняли одинаковую работу.

7. Перегрузка конструкторов в классе. Примеры

Конструкторы классов могут перегружаться точно также как и методы.

Пример 1. Задан класс CPoint , который реализует точку на координатной плоскости. В классе объявляется два перегруженных конструктора.

Ниже продемонстрировано использование перегруженных конструкторов класса

Пример 2. Задан класс Circle , реализующий окружность на координатной плоскости заданного радиуса. В классе реализованы 4 конструктора, которые получают разное количество параметров. Программный код класса следующий

Ниже продемонстрировано использование перегруженных конструкторов класса

8. Каким образом осуществляется вызов перегруженного конструктора с использованием ключевого слова this ? Общая форма

Язык C# позволяет вызвать один конструктор из другого в случае, когда в классе есть несколько перегруженных реализаций конструкторов. Чтобы из заданного конструктора вызвать другой перегруженный конструктор применяется ключевое слово this . Общая форма такого вызова следующая

  • constructor_name – имя конструктора, который осуществляет вызов перегруженного конструктора;
  • parameters1 – параметры конструктора, который осуществляет вызов перегруженного конструктора. Этот конструктор вызывается вторым после вызова конструктора, обозначенного ключевым словом this ;
  • parameters2 – параметры перегруженного конструктора, который обозначен ключевым словом this . Этот конструктор вызывается первым.

9. Пример вызова перегруженного конструктора с использованием ключевого слова this

Пример. Реализация класса CPixel , который описывает пиксел на экране монитора. Пиксел характеризуется следующими параметрами:

  • целочисленные координаты x , y ;
  • цвет ( color ).

Класс содержит 2 перегруженных конструктора. В классе продемонстрирован вызов перегруженного конструктора.

Вызов перегруженного конструктора осуществляется с помощью кода

Конструктор с 3 параметрами вызывает конструктор с 1 параметром. При таком вызове параметр, который есть в вызывающем конструкторе, должен быть обязательно в вызываемом конструкторе (конструкторе this ). В нашем случае, обязательным есть параметр _color .

Классы и объекты C#: перегрузка методов

О том, что такое методы C# и как их создавать мы уже поговорили, научились создавать методы классов и использовать их для доступа к свойствам. Однако, иногда бывает необходимо создать создать более одного метода с одним и тем же именем, но различным набором параметров. В практике программирования такой подход называется перегрузкой методов (method overloading).

С перегрузкой методов как таковой мы уже сталкивались, когда создавали различные конструкторы для нашего первого класса. В языке C# мы можем объявить и создать в классе несколько методов с одним и тем же именем, но различающейся сигнатурой.

Сигнатура метода C#

В C# сигнатура метода складывается из следующих элементов:

  1. Имя метода
  2. Количество и порядок параметров
  3. Типы параметров
  4. Модификаторы параметров

При этом при перегрузке метода его имя не меняется. Например,вернемся к нашему классу Building и создадим метод, который линейно увеличивает все три измерения здания (длину, ширину и высоту):

у этого метода будет следующая сигнатура: ExpandSize(int, int, int) . Теперь перейдем к перегрузке методов C#.

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

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

Также, мы можем поменять количество параметров:

Теперь у нас в классе имеется три метода изменения размеров здания, которые имеют следующие сигнатуры:

  • ExpandSize(int, int, int)
  • ExpandSize(double, double, double)
  • ExpandSize(double, double)

Использование перегруженных методов

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

Чтобы воспользоваться одной из перегрузок метода, мы можем полностью написать имя метода и, поставив после названия метода круглую скобку ( выбрать необходимую перегрузку из списка:

Итого

Сегодня мы познакомились с такими понятиями как сигнатура метода C# и перегрузка методов. Перегрузка методов C# позволяет создавать в классе методы с одинаковым именем, но различающейся сигнатурой.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *