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