На этом шаге мы рассмотрим назначение, синтаксис и особенности использования конструкторов.
В рассмотренных ранее примерах после создания объекта нам приходилось напрямую или с помощью специальных методов присваивать значения полям объекта. Это не всегда удобно. Хорошо было бы иметь возможность задавать значения полей объекта уже на этапе создания объекта. И такая возможность имеется. Связана она с использованием конструктора.
Конструктор - это специальный метод, который автоматически вызывается при создании объекта. Поскольку это метод специальный, то и описывается он специальным способом. Основные правила описания конструктора в классе такие:
Если в инструкции создания объекта на основе оператора new после имени класса в круглых скобках указываются определенные значения, то это и есть аргументы, которые передаются конструктору.
new Класс()
new Класс(аргументы)
Как отмечалось выше, в классе может быть описано несколько конструкторов (или несколько версий конструктора). В таком случае версия конструктора, вызываемая при создании объекта, определяется по количеству и типу аргументов, переданных конструктору в команде создания объекта. Здесь имеет место полная аналогия с перегрузкой методов. Небольшой пример использования конструкторов представлен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr84_1 { // Описание класса с конструктором: class MyClass { // Закрытые поля: private int num; // Целочисленное поле private char symb; // Символьное поле private string txt; // Текстовое поле // Открытый метод для отображения значений полей: public void show() { Console.WriteLine("Поля: {0}, \'{1}\' и \"{2}\"", num, symb, txt); } // Конструктор без аргументов: public MyClass() { // Значения полей: num = 100; symb = 'A'; txt = "Kpacный"; } // Конструктор с одним целочисленным аргументом: public MyClass(int n) { // Значения полей: num = n; symb = 'B'; txt = "Желтый"; } // Конструктор с двумя аргументами: public MyClass(int n, char s) { // Значения полей: num = n; symb = s; txt = "3еленый"; } // Конструктор с тремя аргументами: public MyClass(int n, char s, string t) { // Значения полей: num = n; symb = s; txt = t; } // Конструктор с одним текстовым аргументом: public MyClass(string t) { // Значения полей: num = 0; symb = 'Z'; txt = t; } } // Класс с главным методом: class Program { // Главный метод: static void Main() { // Создание объектов. // Вызывается конструктор без аргументов: MyClass A = new MyClass(); // Проверяются значения полей объекта: A.show(); // Вызывается конструктор с целочисленным аргументом: MyClass B = new MyClass(200); // Проверяются значения полей объекта: B.show(); // Вызывается конструктор с двумя аргументами: MyClass C = new MyClass(300, 'C'); // Проверяются значения полей объекта: C.show(); // Вызывается конструктор с тремя аргументами: MyClass D = new MyClass(400, 'D', "Синий"); // Проверяются значения полей объекта: D.show(); // Вызывается конструктор с символьным аргументом: MyClass F = new MyClass('A'); // Проверяются значения полей объекта: F.show(); // Вызывается конструктор с текстовым аргументом: MyClass G = new MyClass("Серый"); // Проверяются значения полей объекта: G.show(); // Задержка: Console.ReadLine(); } } }
Как выглядит результат выполнения программы, показано ниже.
Рис.1. Результат выполнения программы
Мы в данном случае имеем дело с классом MyClass, у которого есть три закрытых ноля: целочисленное, символьное и текстовое. В классе описан открытый метод show(), отображающий в консольном окне значения полей.
Console.WriteLine("Поля: {0}, \'{1}\' и \"{2}\"", num, symb, txt); .
"Поля: {0}, \'{1}\' и \"{2}\"",
Кроме метода show(), в классе описано пять версий конструктора:
Название конструктора совпадает с названием класса: в данном случае класс называется MyClass, отсюда и название конструктора. В теле конструктора размещаются команды, которые выполняются при создании объекта. Например, так описана версия конструктора без аргументов:
// Конструктор без аргументов: public MyClass() { // Значения полей: num = 100; symb = 'A'; txt = "Kpacный"; }
Это означает, что если мы создаем объект и конструктору не передаем аргументы (как это имеет место в команде
MyClass A = new MyClass();
Конструктор с целочисленным аргументом описан таким образом, что его аргумент определяет значение целочисленного ноля создаваемого объекта, а символьное и текстовое поле получают соответственно значения 'В' и "Желтый".
Конструктору могут передаваться два аргумента: первый целочисленный и второй символьный. Они определяют значения целочисленного и символьного полей объекта. Текстовое поле получает значение "Зеленый". Если же конструктору передаются три аргумента (целое число, символ и текст), то они определяют значения полей объекта, который создается.
Кроме версии конструктора с одним целочисленным аргументом, класс MyClass содержит описание версии конструктора с одним текстовым аргументом. Текстовое значение, переданное аргументом конструктору, задает значение текстового поля создаваемого объекта. При этом целочисленное поле получает значение 0, а символьному полю присваивается значение 'Z'.
В главном методе программы создается несколько объектов. Каждый раз используются разные конструкторы. Значения полей объектов проверяем, вызывая из объектов метод show(). Например, при создании объекта командой
MyClass B = new MyClass(200);
MyClass C = new MyClass(300, 'C');
MyClass D = new MyClass(400, 'D', "Синий"); .
В команде
MyClass G = new MyClass("Серый");
MyClass F = new MyClass('A');
MyClass F = new MyClass('A');
MyClass A = new MyClass();
На следующем шаге мы рассмотрим деструктор.