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

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

}

}

Наши рекомендации