C# 4.0 полное руководство - 2011
Шрифт:
Если конструктор определен только в производном классе, то все происходит очень просто: конструируется объект производного класса, а базовая часть объекта автоматически конструируется его конструктором, используемым по умолчанию. В качестве примера ниже приведен переработанный вариант класса Triangle, в котором определяется конструктор, а член Style делается закрытым, так как теперь он устанавливается конструктором.
//
11 Класс для двумерных объектов. •
class TwoDShape { double pri_width; double pr.i_height;
// Свойства ширины и длины объекта, public double Width {
get { return pri_width; }
set { pri_width = value < 0 ? -value : value; }
}
public double Height {
get { return pri_height; }
set { pri_height = value < 0 ? -value : value; }
}
public void ShowDim {
Console.WriteLine("Ширина и длина равны " +
Width + " и " + Height);
}
}
// Класс для треугольников, производный от класса TwoDShape. class Triangle : TwoDShape { string Style;
// Конструктор.
public Triangle(string s, double w, double h) {
Width = w; // инициализировать член базового класса Height = h; // инициализировать член базового класса Style = s; // инициализировать член производного класса
}
// Возвратить площадь треугольника, public double Area {
return Width * Height / 2;
}
// Показать тип треугольника, public void ShowStyle {
Console.WriteLine("Треугольник " + Style);
}
}
class Shapes3 {
static void Main {
Triangle tl = new Triangle("равнобедренный", 4.0, 4.0); Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0);
Console.WriteLine("Сведения об объекте tl: "); tl.ShowStyle; tl.ShowDim;
Console . WriteLine ("Площадь равна " + tl.AreaO);
Console.WriteLine ;
Console.WriteLine("Сведения об объекте t2: "); t2.ShowStyle; t2 .-ShowDim ;
Console.WriteLine("Площадь равна " + t2.Area);
}
}
В данном примере
Когда конструкторы определяются как в базовом, так и в производном классе, процесс построения объекта несколько усложняется, поскольку должны выполняться конструкторы обоих классов. В данном случае приходится обращаться к еще одному ключевому слову языка С#: base, которое находит двоякое применение: во-первых, для вызова конструктора базового класса; и во-вторых, для доступа к члену базового класса, скрывающегося за членом производного класса. Ниже будет рассмотрено первое применение ключевого слова base.
Вызов конструкторов базового класса
С помощью формы расширенного объявления конструктора производного класса и ключевого слова base в производном классе может быть вызван конструктор, определенный в его базовом классе. Ниже приведена общая форма этого расширенного объявления:
конструктор_производного_класса{список_параметров) : base (список_аргументов) { // тело конструктора
}
где список_аргументов обозначает любые аргументы, необходимые конструктору в базовом классе. Обратите внимание на местоположение двоеточия.
Для того чтобы продемонстрировать применение ключевого слова base на конкретном примере, рассмотрим еще один вариант класса TwoDShape в приведенной ниже программе. В данном примере определяется конструктор, инициализирующий свойства Width и Height. Затем этот конструктор вызывается конструктором класса Triangle.
// Добавить конструктор в класс TwoDShape. using System;
// Класс для двумерных объектов, class TwoDShape { double pri_width; double pri_height;
// Конструктор класса TwoDShape. public TwoDShape(double w, double h) {
Width = w;
Height = h;
}
public double Width {
get { return pri_width; }
set { pri_width = value < 0 ?
– value : value; }