Добавить в цитаты Настройки чтения

Страница 150 из 502

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

Ниже приведен вариант класса TwoDShape, в котором переменные Width и Height превращены в свойства. По ходу дела в этом классе выполняется проверка: являются ли положительными значения свойств Width и Height. Это дает, например, возможность указывать свойства Width и Height в качестве координат формы в любом квадранте прямоугольной системы координат, не получая заранее их абсолютные значения.

<b>// Использовать открытые свойства для установки и </b>

<b>// получения .значений закрытых членов класса.</b>

<b>using System;</b>

<b>// Класс для двумерных объектов,</b>

<b>class </b><b>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 &lt; 0 ? -value : value; }</b>

<b>  }</b>

<b>  public double Height {</b>

<b>    get { return pri_height; }</b>

<b>    set { pri_height = value &lt; 0 ? -value : value; }</b>

<b>  }</b>

<b>  public void ShowDim() {</b>

<b>  Console.WriteLine(&quot;Ширина и высота равны &quot; +</b>

<b>            Width + &quot; и &quot; + Height);</b>

<b>  }</b>

<b>}</b>

<b>// Класс для треугольников, производный от</b>

<b>// класса TwoDShape.</b>

<b>class Triangle : TwoDShape {</b>

<b>  public string Style; // тип треугольника</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(&quot;Треугольник &quot; + Style);</b>

<b>  }</b>

<b>}</b>

<b>class Shapes2 {</b>

<b>  static void Main() {</b>

<b>    Triangle t1 = new Triangle();</b>

<b>    Triangle t2 = new Triangle();</b>

<b>    t1.Width = 4.0;</b>

<b>    t1.Height = 4.0;</b>

<b>    t1.Style = &quot;равнобедренный&quot;;</b>

<b>    t2.Width = 8.0;</b>

<b>    t2.Height = 12.0;</b>

<b>    t2.Style = &quot;прямоугольный&quot;;</b>

<b>    Console.WriteLine(&quot;Сведения об объекте t1: &quot;); </b>

<b>    t1.ShowStyle(); </b>

<b>    t1.ShowDim();</b>

<b>    Console.WriteLine(&quot;Площадь равна &quot; + t1.Area());</b>

<b>    Console.WriteLine();</b>

<b>    Console.WriteLine(&quot;Сведения об объекте t2: &quot;); </b>

<b>    t2.ShowStyle(); </b>

<b>    t2.ShowDim();</b>

<b>    Console.WriteLine(&quot;Площадь равна &quot; + t2.Area());</b>

<b>  }</b>

<b>}</b>

В этом варианте свойства Width и Height предоставляют доступ к закрытым членам pri_width и pri_height класса TwoDShape, в которых фактически хранятся значения ширины и высоты двумерного объекта. Следовательно, значения членов pri_width и pri_height класса TwoDShape могут быть установлены и получены с помощью соответствующих открытых свойств, несмотря на то, что сами эти члены по-прежнему остаются закрытыми.

Базовый и производный классы иногда еще называют суперклассом и подклассом соответственно. Эти термины происходят из практики программирования на Java. То, что в Java называется суперклассом, в C# обозначается как базовый класс. А то, что в Java называется подклассом, в C# обозначается как производный класс. Оба ряда терминов часто применяются к классу в обоих языках программирования, но в этой книге по-прежнему употребляются общепринятые в C# термины базового и производного классов, которые принято употреблять и в C++.