Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

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

В следующем примере, 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
<== предыдущая лекция | следующая лекция ==>
Объявление методов | Деструкторы
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 305; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.