C# 4.0 полное руководство - 2011
Шрифт:
Перегрузка конструкторов
Как и методы, конструкторы также могут перегружаться. Это дает возможность конструировать объекты самыми разными способами. В качестве примера рассмотрим следующую программу.
// Продемонстрировать перегрузку конструктора.
using System;
class MyClass { public int x;
public MyClass {
Console.WriteLine("В конструкторе MyClass."); x = 0;
}
public MyClass(int i) {
Console.WriteLine("В
}
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; // индекс вершины стека
// Сконструировать пустой объект
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 ) {