Конструкторы экземпляра
Конструктор экземпляра вызывается автоматически при создании объекта класса с помощью операции new. Имя конструктора совпадает с именем класса. Рассмотрим основные свойства конструкторов:
- Конструктор не возвращает значение, даже типа void.
- Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.
- Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов - значение null.
До сих пор мы задавали начальные значения полей класса при описании класса. Это удобно в том случае, когда для всех экземпляров класса начальные значения некоторого поля одинаковы. Если же при создании объектов требуется присваивать полю разные значения, это следует делать с помощью явного задания конструктора. В следующем примере добавлен конструктор и метод Print для вывода информации об объекте:
class Circle { public int x; public int y; public int radius; public const double pi = 3.14; public static string name = "Окружность"; public Circle(int x, int y, int r)//конструктор { this.x = x; this.y = y; radius = r; } public void Print() { Console.Write(name); Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", x, y, radius); Console.WriteLine(); } } class Program { static void Main() { Circle a = new Circle(0, 0, 1); //вызов конструктора a.Print(); Circle b=new Circle(10, 10, 5);//вызов конструктора b.Print(); } }Часто бывает удобно задать в классе несколько конструкторов, чтобы обеспечить возможность инициализации объектов разными способами. Для этого конструкторы должны иметь разные сигнатуры. Рассмотрим это на примере:
class Circle { public int x; public int y; public int radius; public const double pi = 3.14; public static string name = "Окружность"; public Circle(int x, int y, int r)//конструктор 1 { this.x = x; this.y = y; radius = r; } public Circle(int r)//конструктор 2 { radius = r; } public void Print() { Console.Write(name); Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", x, y, radius); Console.WriteLine(); } } class Program { static void Main() { Circle a = new Circle(0, 0, 1); //вызов конструктора 1 a.Print(); Circle b=new Circle(5);//вызов конструктора 2 b.Print(); } }Обратите внимание на то, что в конструктое 2 не были инициализированы поля x, y, поэтому им присваивается значение 0.
Если один из конструкторов выполняет какие-либо действия, а другой должен делать то же самое плюс еще что-нибудь, то удобно вызвать первый конструктор из второго. Для этого используется уже известное вам ключевое слово this в другом контексте, например:
public Circle(int x, int y, int r):this(r) //конструктор 1{ this.x = x; this.y = y;} public Circle(int r) //конструктор 2{ radius = r;}Конструкция, находящаяся после двоеточия, называется инициализатором, то есть тем кодом, который исполняется до начала выполнения тела конструктора. В нашем случае конструктор 1 до выполнения своего кода вызывает конструктор 2.
Дата добавления: 2017-03-29; просмотров: 340;