Книга: C# 4.0: полное руководство

Конструкторы

Конструкторы

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

house.Occupants = 4;
house.Area = 2500;
house.Floors = 2;

Такой прием обычно не применяется в профессионально написанном коде С#. Кроме того, он чреват ошибками (вы можете просто забыть инициализировать одно из полей). Впрочем, существует лучший способ решить подобную задачу: воспользоваться конструктором.

Конструктор инициализирует объект при его создании. У конструктора такое же имя, как и у его класса, а с точки зрения синтаксиса он подобен методу. Но у конструкторов нет возвращаемого типа, указываемого явно. Ниже приведена общая форма конструктора.

доступ имя_класса{список_параметров) {
  // тело конструктора
}

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

У всех классов имеются конструкторы, независимо от того, определите вы их или нет, поскольку в C# автоматически предоставляется конструктор, используемый по умолчанию и инициализирующий все переменные экземпляра их значениями по умолчанию. Для большинства типов данных значением по умолчанию является нулевое, для типа bool — значение false, а для ссылочных типов — пустое значение. Но как только вы определите свой собственный конструктор, то конструктор по умолчанию больше не используется.

Ниже приведен простой пример применения конструктора.

// Простой конструктор.
using System;
class MyClass {
  public int x;
  public MyClass() {
    x = 10;
  }
}
class ConsDemo {
  static void Main() {
    MyClass tl = new MyClass();
    MyClass t2 = new MyClass();
    Console.WriteLine(tl.x + " " + t2.x);
  }
}

В данном примере конструктор класса MyClass имеет следующий вид.

public MyClassO {
  x = 10;
}

Обратите внимание на то, что этот конструктор обозначается как public. Дело в том, что он должен вызываться из кода, определенного за пределами его класса. В этом конструкторе переменной экземпляра класса MyClass присваивается значение 10. Он вызывается в операторе new при создании объекта. Например, в следующей строке:

MyClass t1 = new MyClass();

конструктор MyClass() вызывается для объекта t1, присваивая переменной его экземпляра t1.х значение 10. То же самое происходит и для объекта t2. После конструирования переменная t2.х будет содержать то же самое значение 10. Таким образом, выполнение приведенного выше кода приведет к следующему результату.

10 10

Параметризированные конструкторы

В предыдущем примере использовался конструктор без параметров. В некоторых случаях этого оказывается достаточно, но зачастую конструктор, должен принимать один или несколько параметров. В конструктор параметры вводятся таким же образом, как и в метод. Для этого достаточно объявить их в скобках после имени конструктора. Ниже приведен пример применения параметризированного конструктора MyClass.

// Параметризированный конструктор.
using System;
class MyClass { public int x;
  public MyClass(int i) {
    x = i;
  }
}
class ParmConsDemo {
  static void Main() {
    MyClass tl = new MyClass(10);
    MyClass t2 = new MyClass(88);
    Console.WriteLine(tl.x + " " + t2.x);
  }
}

При выполнении этого кода получается следующий результат.

10 88

В данном варианте конструктора MyClass() определен параметр i, с помощью которого инициализируется переменная экземпляра х. Поэтому при выполнении следующей строки кода:

MyClass t1 = new MyClass(10);

параметру i передается значение, которое затем присваивается переменной х.

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

Класс Building можно усовершенствовать, добавив в него конструктор, автоматически инициализирующий поля Floors, Area и Occupants при создании объекта. Обратите особое внимание на то, как создаются объекты класса Building.

// Добавить конструктор в класс Building.
using System;
class Building {
  public int Floors;    //    количество этажей
  public int Area;    //    общая площадь здания
  public int Occupants;    //    количество жильцов
  // Параметризированный конструктор для класса Building,
  public Building(int f, int a, int o) {
    Floors = f;
    Area = a;
    Occupants = o;
  }
  // Возвратить площадь на одного человека,
  public int AreaPerPerson() {
    return Area / Occupants;
  }
  // Возвратить максимальное количество человек, занимающих здание,
  // исходя из заданной минимальной площади на одного человека. 
  public int MaxOccupant(int minArea) {
    return Area / minArea;
  }
}
// Использовать параметризированный конструктор класса Building,
class BuildingDemo {
  static void Main() {
    Building house = new Building(2, 2500, 4);
    Building office = new Building(3, 4200, 25);
    Console.WriteLine("Максимальное количество человек в доме, n" +
           "если на каждого должно приходиться " +
           300 + " кв. футов: " + house.MaxOccupant(300));
    Console.WriteLine("Максимальное количество человек " +
           "в учреждении, n" +
           "если на каждого должно приходиться " +
           300 + " кв. футов: " + office.MaxOccupant(300) );
  }
}

Результат выполнения этой программы оказывается таким же, как и в предыдущей ее версии.

Оба объекта, house и office, были инициализированы конструктором Building() при их создании в соответствии с параметрами, указанными в этом конструкторе. Например, в строке

Building house = new Building(2, 2500, 4);

конструктору Building() передаются значения 2, 2500 и 4 при создании нового объекта. Следовательно, в копиях переменных экземпляра Floors, Area и Occupants объекта house будут храниться значения 2, 2500 и 4 соответственно.

Оглавление книги


Генерация: 0.043. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз