Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

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

Как и методы, конструкторы также могут перегружаться. Это даёт возможность конструировать объекты самыми разными способами:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class UserInfo

{

public string Name, Family;

public byte Age;

// Создадим несколько перегруженных конструкторов

public UserInfo() { }

public UserInfo(string Name)

{

this.Name = Name;

}

public UserInfo(string Name, string Family)

{

this.Name = Name;

this.Family = Family;

}

public UserInfo(string Name, string Family, byte Age)

{

this.Name = Name;

this.Family = Family;

this.Age = Age;

}

}

class Program

{

static void Main(string[] args)

{

// Создадём несколько объектов типа UserInfo

// используя перегруженные конструкторы

UserInfo obj1 = new UserInfo();

UserInfo obj2 = new UserInfo(Name: "John");

UserInfo obj3 = new UserInfo(Name: "John", Family: "A.");

UserInfo obj4 = new UserInfo(Name: "John", Family: "A.", Age: 24);

Console.ReadLine();

}

}

}

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

Когда приходится работать с перегружаемыми конструкторами, то иногда очень полезно предоставить возможность одному конструктору вызывать другой. В С# это даётся с помощью ключевого слова this. Ниже приведена общая форма такого вызова:

<имя конструктора>(<список параметров1>) : this(<список параметров2>)

{

//...

// Тело конструктора, которое может быть пустым

}

В исходном конструкторе сначала выполняется перегружаемый конструктор, список параметров которого соответствует критерию список параметров2, а затем все остальные операторы, если таковые имеются в исходном конструкторе. Ниже приведён соответствующий пример:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class UserInfo

{

public string Name, Family;

public byte Age;

// Используем ключевое слово this для

// создания "цепочки" конструкторов

public UserInfo()

: this("None", "None", 0)

{

}

public UserInfo(UserInfo obj)

: this(obj.Name, obj.Family, obj.Age)

{

}

public UserInfo(string Name, string Family, byte Age)

{

this.Name = Name;

this.Family = Family;

this.Age = Age;

}

}

class Program

{

static void Main(string[] args)

{

UserInfo ui1 = new UserInfo();

Console.WriteLine("ui1: {0}, {1}, {2}", ui1.Name, ui1.Family, ui1.Age);

UserInfo ui2 = new UserInfo("John", "A.", 24);

Console.WriteLine("ui2: {0}, {1}, {2}", ui2.Name, ui2.Family, ui2.Age);

UserInfo ui3 = new UserInfo(ui2);

Console.WriteLine("ui3: {0}, {1}, {2}", ui3.Name, ui3.Family, ui3.Age);

Console.WriteLine("Для продолжения нажмите любую клавишу . . .");

Console.ReadKey();

}

}

}

Рис. 1. 1. Результат работы кода выше

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