Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Принципиально разные операции. Такое применение перегрузки методов противоречит ее первоначальному назначению. На практике перегружать следует только тесно связанные операции.




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

Перегрузка конструкторов

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

// Продемонстрировать перегрузку конструктора.

Using System;

class MyClass { public int x;

public MyClass() {

Console.WriteLine("В конструкторе MyClass()."); x = 0;

}

public MyClass(int i) {

Console.WriteLine("В конструкторе MyClass(int)."); x = i;

}

public MyClass(double d) {

Console.WriteLine("В конструкторе MyClass(double)."); x = (int) d;

}

public MyClass(int i, int j) {

Console.WriteLine("В конструкторе MyClass(int, int)."); x = i * j;

}

}

class OverloadConsDemo { static void MainO- {

MyClass tl = new MyClass ();

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.х: " + t2.x);

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

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

}

}

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

В конструкторе MyClass().

В конструкторе MyClass (int).

В конструкторе MyClass(double).

В конструкторе MyClass (int, int). tl.x: О t2.x: 88 t3.x: 17 t4.x: 8

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

Одна из самых распространенных причин для перегрузки конструкторов заключается в необходимости предоставить возможность одним объектам инициализировать другие. В качестве примера ниже приведен усовершенствованный вариант разработанного ранее класса Stack, позволяющий конструировать один стек из другого.

// Класс для хранения символов в стеке.

Using System;

class Stack {

// Эти члены класса являются закрытыми, char[] stck; // массив, содержащий стек int tos; // индекс вершины стека

// Сконструировать пустой объект класса Stack по заданному размеру стека, public Stack(int size) {

stck = new char[size]; // распределить память для стека tos = 0;

}

// Сконструировать объект класса Stack из существующего стека, public Stack(Stack ob) {

// Распределить память для стека, stck = new char[ob.stck.Length];

// Скопировать элементы в новый стек, for (int i=0; i < ob.tos; i++) stck[i] = ob.stck[i];

// Установить переменную tos для нового стека, tos = ob.tos;

// Поместить символы в стек, public void Push(char ch) { if(tos==stck.Length) {

Console.WriteLine(" - Стек заполнен."); return; -

}

stck[tos] = ch; tos++;

}

// Извлечь символ из стека, public char Pop () {

if(tos==0) {

Console.WriteLine (" - Стек пуст."); return (char) 0;

}

Tos—;

return stck[tos];

}

// Возвратить значение true, если стек заполнен, public bool IsFullO { return tos==stck.Length;

}

// Возвратить значение true, если стек пуст, public bool IsEmptyO { return tos==0;

}

// Возвратить общую емкость стека, public int Capacity() {

Return stck.Length;

}

// Возвратить количество объектов, находящихся в настоящий момент в стеке, public int GetNum() { return tos;

}

}

// Продемонстрировать применение класса Stack.

class StackDemo {

static void Main() {

Stack stkl = new Stack(10); char ch; int i;

// Поместить ряд символов в стек stkl.

Console.WriteLine("Поместить символы А-J в стек stkl."); for(i=0;!stkl.IsFull(); i++)

stkl.Push((char) ('A' + i));

// Создать копию стека stckl.

Stack stk2 = new Stack(stkl);

// Вывести содержимое стека stkl.

Console.Write("Содержимое стека stkl: "); while (!stkl.IsEmpty()) {

ch = stkl.Pop ();

Console.Write(ch);

}

Console.WriteLine ();

Console.Write("Содержимое стека stk2: "); while (!stk2.IsEmpty()) {

ch = stk2.Pop ();

Console.Write(ch);

}

Console.WriteLine ("\n");

}

}





Поделиться с друзьями:


Дата добавления: 2016-12-03; Мы поможем в написании ваших работ!; просмотров: 358 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Даже страх смягчается привычкой. © Неизвестно
==> читать все изречения...

2502 - | 2194 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.