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

Вызов методов

В следующем примере, MathTest, демонстрируется определение и создание экземпляров классов, а также определение и вызов методов. Помимо класса, содержащего методMain (), в нем определен класс по имени MathTest, содержащий набор методов и полей.

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MathProbe{ class Program { static void Main(string[] args) { // Попытка вызова некоторых статических функций Console.WriteLine ("Pi равно " + MathTest.GetPi ()); int x = MathTest.GetSquareOf(5); Console.WriteLine("5 в квадрате равно " + x) ; // Создание объекта MathTest MathTest math = new MathTest (); // это способ, которым в С# создаются // экземпляры ссылочного типа // Вызов нестатических методов math.value = 30; Console.WriteLine("Поле value переменной math содержит " + math.value); Console.WriteLine("30 в квадрате равно " + math.GetSquare()); Console.ReadLine(); } }// Определение класса MathTest, методы которого мы вызываем class MathTest { public int value; public int GetSquare() { return value * value; } public static int GetSquareOf(int x) { return x * x; } public static double GetPi() { return 3.14159; } }}

Запуск на выполнение примера MathTest даст следующий результат:

Pi равно 3.141595 в квадрате равно 25Поле value переменной math содержит 3030 в квадрате равно 900

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

Некоторые свойства этого класса на самом деле не могут служить примером правильного дизайна программы С#. Например, GetPi () следовало бы реализовать в виде константного поля, но остальная часть демонстрирует концепции, которые пока не рассматривались.

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

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

Ниже приведен простой пример, демонстрирующий перегрузку методов.

namespace ConsoleApplication1{ class Overload { public void OvlDemo() { Console.WriteLine("Без параметров"); } // Перегрузка метода OvlDemo с одним целочисленным параметром, public void OvlDemo(int a) { Console.WriteLine("Один параметр: " + a); } // Перегрузка метода OvlDemo с двумя целочисленными параметрами, public int OvlDemo(int a, int b) { Console.WriteLine("Два параметра: " + a + " " + b); return a + b; } // Перегрузка метода OvlDemo с двумя параметрами типа double, public double OvlDemo(double a, double b) { Console.WriteLine("Два параметра типа double: " + a + " "+ b); return a + b; } } class Program { static void Main(string[] args) { Overload ob = new Overload(); int resI; double resD; // Вызвать все варианты метода OvlDemoO . ob.OvlDemo() ; Console.WriteLine (); ob.OvlDemo (2); Console.WriteLine (); resI = ob.OvlDemo(4, 6); Console.WriteLine("Результат вызова метода ob.OvlDemo(4, 6): " + resI); Console.WriteLine (); resD = ob.OvlDemo(1.1, 2.32); Console.WriteLine("Результат вызова метода ob.OvlDemo(1.1, 2.32): " + resD); Console.ReadLine(); } }}

Вот к какому результату приводит выполнение приведенного выше кода.

Без параметровОдин параметр: 2Два параметра: 4 6Результат вызова метода ob.OvlDemo (4, 6): 10Два параметра типа double: 1.1 2.32Результат вызова метода ob.OvlDemo (1.1, 2.32): 3.42