Шилдт Герберт
Шрифт:
// Использовать открытые свойства для установки и // получения .значений закрытых членов класса.
using System;
// Класс для двумерных объектов, class TwoDShape {
double pri_width; // теперь это закрытая переменная double pri_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 {
public string Style; // тип треугольника
// Возвратить площадь треугольника, public double Area {
return Width * Height / 2;
}
// Показать тип треугольника, public void ShowStyleO {
Console.WriteLine("Треугольник " + Style);
}
}
class Shapes2 {
static void Main {
Triangle tl = new Triangle ;
Triangle t2 = new Triangle ;
tl.Width = 4.0;
tl.Height = 4.0;
tl.Style = "равнобедренный";
t2.Width = 8.0;
t2.Height = 12.0;
t2.Style = "прямоугольный";
Console.WriteLine("Сведения об объекте tl: "); tl.ShowStyle; tl.ShowDim;
Console . WriteLine ("Площадь равна " + tl.AreaO);
Console.WriteLine ;
Console.WriteLine("Сведения об объекте t2: "); t2.ShowStyle; t2.ShowDim;
Console.WriteLine("Площадь равна " + t2.Area);
}
}
В этом варианте свойства Width и Height предоставляют доступ к закрытым членам pri_width и pri_height класса TwoDShape, в которых фактически хранятся значения ширины и высоты двумерного объекта. Следовательно, значения членов pri_width и pri_height класса TwoDShape могут быть установлены и получены с помощью соответствующих открытых свойств, несмотря на то, что сами эти члены по-прежнему остаются закрытыми.
Базовый и производный классы иногда еще называют суперклассом и подклассом соответственно. Эти термины происходят из практики программирования на Java. То, что в Java называется суперклассом, в C# обозначается как базовый класс. А то, что в Java называется подклассом, в C# обозначается как производный класс. Оба ряда терминов часто применяются к классу в обоих языках программирования, но в этой книге по-прежнему употребляются общепринятые в C# термины базового и производного классов, которые принято употреблять и в C++.
Организация защищенного доступа
Как пояснялось выше, открытый член базового класса недоступен для производного класса. Из этого можно предположить, что для доступа к некоторому члену базового класса из производного класса этот член необходимо сделать открытым. Но если сделать член класса открытым, то он станет доступным для всего кода, что далеко не всегда желательно. Правда, упомянутое предположение верно лишь отчасти, поскольку в C# допускается создание защищенного члена класса. Защищенный член является открытым в пределах иерархии классов, но закрытым за пределами этой иерархии.
Защищенный член создается с помощью модификатора доступа protected. Если член класса объявляется как protected, он становится закрытым, но за исключением одного случая, когда защищенный член наследуется. В этом случае защищенный член базового класса становится защищенным членом производного класса, а значит, доступным для производного класса. Таким образом, используя модификатор доступа protected, можно создать члены класса, являющиеся закрытыми для своего класса, но все же наследуемыми и доступными для производного класса.