// Класс для треугольников, производный от // класса TwoDShape. class Triangle : TwoDShape { public string Style; // тип треугольника // Возвратить площадь треугольника. public double Area { return Width * Height / 2; } // Показать тип треугольника. public void ShowStyle { Console.WriteLine("Треугольник " + Style); }
}
class Shapes2 { static void Main { Triangle t1 = new Triangle; Triangle t2 = new Triangle; t1.Width = 4.0; t1.Height = 4.0; t1.Style = "равнобедренный"; t2.Width = 8.0; t2.Height = 12.0; t2.Style = "прямоугольный"; Console.WriteLine("Сведения об объекте t1: "); t1.ShowStyle; t1.ShowDim; Console.WriteLine("Площадь равна " + t1.Area); 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, можно создать члены класса, являющиеся закрытыми для своего класса, но все же наследуемыми и доступными для производного класса. Ниже приведен простой пример применения модификатора доступа protected.
// Продемонстрировать применение модификатора доступа protected. using System;
class В { protected int i, j; // члены, закрытые для класса В, // но доступные для класса D public void Set(int a, int b) { i = a; j = b; } public void Show { Console.WriteLine(i + " " + j); }
}
class D : В { int k; // закрытый член // члены i и j класса В доступны для класса D public void Setk { k = i * j; } public void Showk { Console.WriteLine(k); }
}