Страница 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 < 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>// Класс для треугольников, производный от</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("Треугольник " + 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 = "равнобедренный";</b>
<b> t2.Width = 8.0;</b>
<b> t2.Height = 12.0;</b>
<b> t2.Style = "прямоугольный";</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>
В этом варианте свойства Width и Height предоставляют доступ к закрытым членам pri_width и pri_height класса TwoDShape, в которых фактически хранятся значения ширины и высоты двумерного объекта. Следовательно, значения членов pri_width и pri_height класса TwoDShape могут быть установлены и получены с помощью соответствующих открытых свойств, несмотря на то, что сами эти члены по-прежнему остаются закрытыми.
Базовый и производный классы иногда еще называют суперклассом и подклассом соответственно. Эти термины происходят из практики программирования на Java. То, что в Java называется суперклассом, в C# обозначается как базовый класс. А то, что в Java называется подклассом, в C# обозначается как производный класс. Оба ряда терминов часто применяются к классу в обоих языках программирования, но в этой книге по-прежнему употребляются общепринятые в C# термины базового и производного классов, которые принято употреблять и в C++.