Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Вызов перегружаемого конструктора с помощью ключевого слова this C# Полное руководство Герберт Шилдт

Вызов перегружаемого конструктора с помощью ключевого слова this C# Полное руководство Герберт Шилдт

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

имя_конструктора (список_параметров1) :
                     this (список_параметров2) {
   // ... Тело конструктора,
   // которое может быть пустым.
}


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

// Продемонстрировать вызов конструктора с помощью
// ключевого слова this.

using System;

class XYCoord {
   public int x, y;

   public XYCoord() : this(0, 0) {
      Console.WriteLine ("В конструкторе XYCoord () ") ;
   }

   public XYCoord(XYCoord obj) : this(obj.x, obj.y) {
      Console .WriteLine ("В конструкторе XYCoord (obj ) ") ;
   }

   public XYCoord(int i, int j) {
      Console. WriteLine ("В конструкторе XYCoord (int, int)");
      x = i;
      y = j;
   }
}

class OverloadConsDemo {
   static void Main() {
      XYCoord t1 = new XYCoord();
      XYCoord t2 = new XYCoord (8, 9);
      XYCoord t3 = new XYCoord(t2);

      Console.WriteLine("t1.x, t1.y: " + t1.x + ", " + t1.y);
      Console.WriteLine("t2.x, t2.y: " + t2.x + ", " + t2.y);
      Console.WriteLine("t3.x, t3.y: " + t3.x + ", " + t3.y) ;
   }
}

Выполнение этого кода приводит к следующему результату:
   В конструкторе XYCoord(int, int)
   В конструкторе XYCoord()
   В конструкторе XYCoord(int, int)
   В конструкторе XYCoord(int, int)
   В конструкторе XYCoord(obj)
   t1.x, t1.y: 0, 0
   t2.x, t2.y: 8, 9
   t3.x, t3.y: 8, 9

Код в приведенном выше примере работает следующим образом. Единственным конструктором, фактически инициализирующим поля х и у в классе XYCoord, является конструктор XYCoord (int, int).А два других конструктора просто вызывают этот конструктор с помощью ключевого слова this. Например, когда создается объект tl, то вызывается его конструктор XYCoord (), что приводит к выполнению вызова this (0, 0), который в данном случае преобразуется в вызов конструктора XYCoord (0, 0). То же самое происходит и при создании объекта t2.
Вызывать перегружаемый конструктор с помощью ключевого слова this полезно, в частности, потому, что он позволяет исключить ненужное дублирование кода. В приведенном выше примере нет никакой необходимости дублировать во всех трех конструкторах одну и ту же последовательность инициализации, и благодаря применению ключевого слова this такое дублирование исключается. Другое преимущество организации подобного вызова перезагружаемого конструктора заключается в возможности создавать конструкторы с задаваемыми “по умолчанию” аргументами, когда эти аргументы не указаны явно. Ниже приведен пример создания еще одного конструктора XYCoord.
   public XYCoord(int x) : this(x, x) { }
По умолчанию в этом конструкторе для координаты у автоматически устанавливается то же значение, что и для координаты у. Конечно, пользоваться такими конструкциями с задаваемыми “по умолчанию” аргументами следует благоразумно и осторожно, чтобы не ввести в заблуждение пользователей классов.