Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

VarParams(a, b, c);

Console.WriteLine("\na={0}, b={1}, c={2}", a, b, c);

}

}

Результат выполнения программы:

var[0]=4 var[1]=6 var[2]=10

a=2, b=3, c=5

Значения переменных a, b, c после их использования в качестве аргументов

метода varParams( ) не изменились, хотя в теле метода элементы массива-параметра

присвоены новые значения.

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

Перегрузка методов "метод:перегрузка методов" представляет собой ещё один

частный случай полиморфизма.

Полиморфизм

"полиморфизм"

– в переводе с греческого означает "много

форм". В отношении к методам полиморфизм позволяет с помощью одного имени

представлять различный код, то есть различное поведение. Важно здесь, что выбор

подходящего кода выполняется автоматически на этапе трансляции или исполнения

программы.

Полиморфизм не обязательно связан с перегрузкой методов и присущ не

только полиморфным языкам, к которым относится C#. Практически во всех

языках

программирования

знаки

арифметических

операций

применимы

к

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

вещественные операнды. Для этого используются операции * и +. Однако, н

а

уровне машинных команд операции с целочисленными операндами могут быть

реализованы не так, как операции над вещественными числами. Компилятор

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

соответствующие действия. В языках С++ и C# эта возможность применима и к

типам, которые вводит программист с помощью определений классов. В этом

случае

говорят

о

перегрузке

"операции:перегрузка

операций"

или

распространении действия операций на объекты новых классов. Этому виду

полиморфизма нужно уделить особое внимание при изучении пользовательских

классов. А сейчас вернёмся к полиморфизму перегрузки методов.

В программе (и в классе) одно имя (идентификатор) может относиться к

разным методам, реализующим в общем случае совершенно разные алгоритмы.

Выбор нужного метода при вызове определяется конкретным набором аргументов,

размещённых в скобках после имени метода, и тем пространством имён, к которому

отнесено имя метода. О таком различии говорят, что методы различаются своими

сигнатурами "сигнатура" .

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

примере. Пусть требуется вычислять площадь S треугольника на основе разных

исходных данных.

Вариант 1 – известны длины основания (d) и высоты (h):

S=(d*h)/2;

Вариант 2 – известны длины сторон (a,b,c):

S=(p(p-a)(p-b)(p-c))0.5 , где p=(a+b+c)/2;

Вариант 3 – известны длины сторон (a,b,c) и радиус (R) описанной около

треугольника окружности:

S=(a*b*c)/(4*R).

Три метода, реализующие приведённые варианты вычисления площади

треугольника, можно обозначить одним именем. Методы будут отличаться

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

о

так:

static double area(double d, double h)

{ return d*h/2;}

static double area(double a, double b, double c)

{ double p=(a+b+c)/2;

return Math.Sqrt(p*(p-a)*(p-b)*(p-c)); }

static double area(double a, double b, double c, double R)

{ return(a*b*c)/(4*R); }

В данном примере предполагается, что все методы являются методами одного

класса. В функции Main() того же класса (программа 09_15.cs) можно так

обратиться к каждому из них:

Console.WriteLine("area1="+ area(4.0,3.0));

Console.WriteLine("area2="+ area(3.0,4.0,5.0));

Console.WriteLine("area3="+ area(3.0,4.0,5.0,2.5));

Подводя итоги обсуждения перегрузки методов "метод:перегрузка методов" \y

"метод" , ещё раз повторим, что сигнатура метода "метод:сигнатура метода" –

это комбинация его имени, спецификации параметров, и пространства имён, к

которому относится метод. Кроме того имя класса, в котором объявлен метод, и

модификаторы параметров out и ref входят в сигнатуру, а модификаторы метода

(например, static public) в сигнатуру не входят.

Обратите внимание, что тип возвращаемого методом значения не входит в его

сигнатуру.

Соседние файлы в папке CSBasicCourse2ndedPodbelsky