Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Ref тип имя

Пример заголовка метода, имеющего один параметр-ссылку целого типа: voidF(refinty)

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

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

Проиллюстрируем передачу параметров-значений и параметров-ссылок на при­мере (листинг 1.4).

Листинг 1.4. Параметры-значения и параметры-ссылки

using System;

namespace ConsoleApplication1

{ class Class1

{static void P(int a, ref int b)

{a = 44; b = 33;

Console.WriteLine("внутриметода {0} {1}”, a, b);

}

staticvoidMain()

{

int a = 2, b = 4;

Console.WriteLine("довызова {0} {1}”, a, b);

P(a, ret b);

Console.WriteLine("послевызова {0} {1}", a, b);

}

}

}

 

3.1.1.3 Выходные параметры

 

Довольно часто возникает необходимость в методах, которые формируют не­сколько величин, например, если в методе создаются объекты или инициализи­руются ресурсы. В этом случае становится неудобным ограничение параметров-ссылок: необходимость присваивания значения аргументу до вызова метода. Это ограничение снимает спецификатор out. Параметру, имеющему этот специфика­тор, должно быть обязательно присвоено значение внутри метода, компилятор за этим следит. Зато в вызывающем коде можно ограничиться описанием пере­менной без инициализации.

 

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

ВС# два или больше методов внутри одного класса могут иметь одинаковое имя, но при условии, что их параметры будут различными. Такую ситуацию называют перегрузкой методов (methodoverloading), а методы, которые в ней задействованы, — перегруженными (overloaded). Перегрузка методов — один из способов реализации полиморфизма в С#.

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

using System;

class Overload {

public void ovlDemo() {

Console.WriteLine("Без параметров");

}

// Перегружаем метод ovlDemo() для одного

// целочисленного параметра,

public void ovlDemo(int a) {

Console.WriteLine("Одинпараметр: " + a);

}

// ПерегружаемметодovlDemo() длядвух

// целочисленныхпараметров,

publicintovlDemo(int a, int b) {

Console.WriteLine("Дваint-параметра: " + a + " " + b);

returna + b;

}

// Перегружаемметод ovlDemo() длядвух

// double-параметров.

public double ovlDemo(double a, double b) {

Console.WriteLine("Два double-параметра: " +

a + " "+ b);

return a + b;

}

}

classOverloadDemo {

public static void Main() {

Overload ob = new Overload();

intresl;

doubleresD;

// Вызываем все версии метода ovlDemo().

ob.ovlDemo();

Console.WriteLine();

ob.ovlDemo(2);

Console.WriteLine();

resl = ob.ovlDemo(4, 6);

Console.WriteLine("Результатвызоваob.ovlDemo(4, 6):”

+ resl);

Console.WriteLine();

resD = ob.ovlDemo(1.1, 2.32);

Console.WriteLine("Результатвызоваob.ovlDemo(1.1, 2.2):”+resD);

}}

Посредством перегрузки методов в С# поддерживается полиморфизм, поскольку это единственный способ реализации в С# парадигмы "один интерфейс — множество методов".

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

using System;

classMyClass {

publicint x;

publicMyClass() {

Console.WriteLine("ВнутриконструктораMyClass().");

x = 0;

}

publicMyClass(inti) {

Console.WriteLine("ВнутриконструктораMyClass(int).");

x = i;

}

publicMyClass(double d) {

Console.WriteLine(

"ВнутриконструктораMyClass(double).");

x = (int) d;

}

publicMyClass(inti, int j) {

Console.WriteLine(

"ВнутриконструктораMyClass(int, int).");

x = i * j;

}}

classOverloadConsDemo {

public static void Main() {

MyClasstl = new MyClassO;

MyClass t2 = new MyClass(88);

MyClass t3 = new MyClass(17.23);

MyClass t4 = new MyClass(2, 4);

Console.WriteLine("tl.x: " + tl.x);

Console.WriteLine("t2.x: " + t2.x);

Console.WriteLine("t3.x: " + t3.x);

Console.WriteLine("t4.x: " + t4.x);

}}

 

Конструктор MyClass () перегружен четырежды, и все конструкторы создают объекты по-разному. В зависимости от того, какие параметры заданы при выполнении оператора new, вызывается соответствующий конструктор. Перегружая конструктор класса, вы тем самым предоставляете пользователю этого класса определенную гибкость в выборе способа создания объектов.

 

4.3 Перегрузка операторов

Язык С# позволяет определить значение оператора относительно создаваемогокласса. Этот процесс называется перегрузкой операторов. Перегружая оператор,вы расширяете его использование для класса. Результат действия оператора полностью находится в ваших руках, и может быть разным при переходе от класса к классу.

Например, класс, который определяет связный список, может использовать оператор" + " для добавления объектов в список. Класс, который реализует стек, может использовать оператор " + " для занесения объекта в стек. А какой-то другой класс может использовать этот оператор иным способом.

При перегрузке оператора ни одно из его исходных значений не теряется. Перегрузку оператора можно расценивать как введение новой операции для класса. Следовательно, перегрузка оператора " + ", например, для обработки связного списка (в качестве оператора сложения) не изменяет его значение применительно к целым числам.

Главное достоинство перегрузки операторов состоит в том, что она позволяет интегрировать новый тип класса со средой программирования. Эта расширяемость типов — важная составляющая мощи таких объектно-ориентированных языковпрограммирования, как С#. Если для класса определены некоторые операторы, выможете оперировать объектами этого класса, используя обычный С#-синтаксис выражений. Более того, вы можете использовать в выражениях объект, включающий другие типы данных. Перегрузка операторов — одно из самых мощных средств языка С#.

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

Существует две формы методов operator: одна используется для унарных операторов, а другая — для бинарных. Общий же формат (для обоих случаев) таков:

// Общий формат перегрузки для унарного оператора,

<== предыдущая лекция | следующая лекция ==>
Листинг 1.3 | Public static ThreeD operator -(ThreeDopl, ThreeD op2)
Поделиться с друзьями:


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


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



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




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