Урок 7. Перегрузка конструктора в C#


Седьмой урок учебника по объектно-ориентированному программированию на C# расширяет предыдущее описание перегрузки методов перегрузкой конструктора. Используя эту технику, можно создать несколько конструкторов на выбор во время создания объекта.

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

Ранее на уроках мы рассматривали использование конструкторов и перегрузку методов. В данной статье мы объединим эти два метода, чтобы можно было определить несколько конструкторов для одного класса. Это дает классу гибкость для создания объектов различными способами в зависимости от способа их использования.

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

Создать перегруженный конструктор так же просто, как добавить перегруженные методы. Дополнительные конструкторы просто добавляются в код. Каждый конструктор должен иметь уникальную подпись, т.е. типы параметров должны отличаться от всех других конструкторов.

Чтобы продемонстрировать использование перегруженных конструкторов, мы создадим новый класс для представления прямоугольных фигур. Класс позволит генерировать объект Rectangle с указанными свойствами высоты и ширины. Затем мы добавим второй конструктор, который требует только одного параметра для квадратных фигур с соответствующими высотой и шириной.

Для начала создайте новое консольное приложение и добавьте новый файл класса с именем «Rectangle». Добавьте следующий код в новый класс для создания свойств:

class Rectangle
{
    private int _height;
    private int _width;
 
    public int Height
    {
        get { return _height; }
    }
 
    public int Width
    {
        get { return _width; }
    }
}
Примечание. В этом коде свойства Height и Width сделаны доступными только для чтения. Это должно упростить код урока.

Добавление конструкторов

Теперь мы можем добавить первый конструктор в класс. Этот конструктор принимает два параметра, содержащие высоту и ширину прямоугольника. Код проверки гарантирует, что они оба являются положительными значениями перед сохранением их в переменных свойства. При добавлении этого конструктора конструктор по умолчанию будет удален. Добавьте следующий конструктор в класс:

public Rectangle(int height, int width)
{
    if (height <= 0) throw new ArgumentException("height");
    if (width <= 0) throw new ArgumentException("width");
 
    _height = height;
    _width = width;
 
    Console.WriteLine("Rectangle Constructor Called");
}
Чтобы добавить второй конструктор, мы просто объявляем другой вариант с другой подписью. Добавьте следующий код, который разрешает создание объектов Rectangle, представляющих квадраты. Требуется только один параметр, который можно сохранить в переменных свойств width и height.

public Rectangle(int size)
{
    if (size <= 0) throw new ArgumentException("height");
 
    _height = _width = size;
 
    Console.WriteLine("Square Constructor Called");
}
Использование перегруженных конструкторов

Перегруженные конструкторы могут использоваться для создания экземпляров объектов точно так же, как и для классов с одним конструктором. Во время компиляции кода компилятор сравнивает сигнатуру, используемую для нового объекта, с сигнатурами, доступными в классе. Если есть идеальное совпадение, используется соответствующий конструктор. Там, где нет подписи с правильными параметрами, компилятор будет искать конструктор, который можно использовать с неявным приведением. Если такого конструктора не существует, возникает ошибка компилятора.

Теперь мы можем проверить пример кода, изменив основной метод программы следующим образом:

static void Main(string[] args)
{
    Rectangle rect = new Rectangle(4, 6);
    Console.WriteLine("Height: {0}", rect.Height);
    Console.WriteLine("Width: {0}", rect.Width);
 
    Rectangle square = new Rectangle(5);
    Console.WriteLine("Height: {0}", square.Height);
    Console.WriteLine("Width: {0}", square.Width);
}
 
/*
 
Rectangle Constructor Called
Height: 4
Width: 6
Square Constructor Called
Height: 5
Width: 5
 
*/
Взаимодействие конструктора

Конструкторы могут быть очень сложными, выполняя множество функций инициализации и проверки новых объектов. Это может легко привести к большим конструкторам с функциональностью, которая повторяется в каждой перегруженной версии. Это, в свою очередь, может привести к проблемам с обслуживанием кода, когда требуются изменения в логике построения. Это может быть сведено к минимуму, если иметь методы вызова конструктора внутри класса для выполнения общих задач. Другой вариант - разрешить повторное использование кода, если конструкторы будут вызывать друг друга во время создания объекта.

Синтаксис вызова конструктора

Чтобы создать конструктор, который вызывает существующий конструктор, используется специальный синтаксис. Конструктор объявляется как обычно, а затем добавляется символ двоеточия (:). После двоеточия предоставляется ключевое слово this и список параметров вызываемого конструктора.

public Constructor(parameters-1) : this(parameters-2) { }
Когда используется новый конструктор, сначала выполняется конструктор, указанный в команде this, затем выполняется код в блоке кода нового конструктора. Возможно, что блок кода пуст, когда требуется только преобразование подписи. В этом случае выполняется только оригинальный конструктор с указанными параметрами.

Это повторное использование кода может быть продемонстрировано путем изменения конструктора, который создает квадратный объект Rectangle следующим образом:

public Rectangle(int size) : this(size, size)
{
    Console.WriteLine("Square Constructor Called");
}
Запуск программы теперь показывает порядок выполнения конструкторов. Результаты приведены ниже:

Rectangle Constructor Called
Height: 4
Width: 6
Rectangle Constructor Called
Square Constructor Called
Height: 5
Width: 5
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, ООП




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Мои программы
HTML5 игры: что там у нас внутри
Поздравление с помощью j2me