Страница 153 из 502
<b>// Добавить конструктор в класс TwoDShape. </b>
<b>using System;</b>
<b>// Класс для двумерных объектов, </b>
<b>class TwoDShape { </b>
<b> double pri_width; </b>
<b> double pri_height;</b>
<b> // Конструктор класса TwoDShape. </b>
<b> public TwoDShape(double w, double h) {</b>
<b> Width = w;</b>
<b> Height = h;</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) : base(w, 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 Shapes4 {</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 объявляется следующим образом.
<b>public Triangle(</b>
<b> string s, double w, double h) : base(w, h) {</b>
В данном варианте конструктор Triangle() вызывает метод base с параметрами w и h. Это, в свою очередь, приводит к вызову конструктора TwoDShape(), инициализирующего свойства Width и Height значениями параметров w и h. Они больше не инициализируются средствами самого класса Triangle, где теперь остается инициализировать только его собственный член Style, определяющий тип треугольника. Благодаря этому класс TwoDShape высвобождается для конструирования своего подобъекта любым избранным способом. Более того, в класс TwoDShape можно ввести функции, о которых даже не будут подозревать производные классы, что предотвращает нарушение существующего кода.
С помощью ключевого слова base можно вызвать конструктор любой формы, определяемой в базовом классе, причем выполняться будет лишь тот конструктор, параметры которого соответствуют переданным аргументам. В качестве примера ниже приведены расширенные варианты классов TwoDShape и Triangle, в которые включены как используемые по умолчанию конструкторы, так и конструкторы, принимающие один аргумент.
<b>// Добавить дополнительные конструкторы в класс TwoDShape.</b>
<b>using System;</b>
<b>class TwoDShape { </b>
<b> double pri_width; </b>