Скачиваний:
74
Добавлен:
24.03.2015
Размер:
300.54 Кб
Скачать

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

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

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

Полиморфизм не обязательно связан с перегрузкой методов и присущ не только полиморфным языкам, к которым относится С#. Практически во всех языках программирования знаки арифметических операций применимы к операндам разных типов. Например, умножать и суммировать можно и целые и вещественные операнды. Для этого используются операции * и +. Однако, на уровне машинных команд операции с целочисленными операндами могут быть реализованы не так, как операции над вещественными числами. Компилятор автоматически по типам операндов определяет как должны выполняться соответствующие действия. В языках C++ и С# эта возможность применима и к типам, которые вводит программист с помощью определений классов. В этом случае говорят о перегрузке или распространении действия операций на объекты новых классов. Этому виду полиморфизма нужно уделить особое внимание, при изучении пользовательских классов. А сейчас вернёмся к полиморфизму перегрузки методов.

В программе (и в классе) одно имя (идентификатор) может относиться к разным методам, реализующим в общем случае совершенно разные алгоритмы. Выбор нужного метода при вызове определяется конкретным набором аргументов, размещённых в скобках после имени метода," и тем пространством имён, к которому отнесено имя метода. О таком различии говорят, что методы различаются своими сигнатурами.

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

Вариант 1 - известны длины основания (d) и высоты (h): S=(d*h)/2;

Вариант 2 - известны длины сторон (а,Ь,с): S=(p(p-a)(p-b)(p-c))0,5, где р=(а+Ь+с)/2;

Вариант 3 - известны длины сторон (а,Ь,с) и радиус (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) можно так обратиться к каждому из них:

static void Main09_15()

{

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));

}

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

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

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