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
могут быть установлены и получены с помощью соответствующих открытых свойств, несмотря на то, что сами эти члены по-прежнему остаются закрытыми.
Базовый и производный классы иногда еще называют
Как пояснялось выше, открытый член базового класса недоступен для производного класса. Из этого можно предположить, что для доступа к некоторому члену базового класса из производного класса этот член необходимо сделать открытым. Но если сделать член класса открытым, то он станет доступным для всего кода, что далеко не всегда желательно. Правда, упомянутое предположение верно лишь отчасти, поскольку в C# допускается создание
Защищенный член создается с помощью модификатора доступа protected
. Если член класса объявляется как protected
, он становится закрытым, но за исключением одного случая, когда защищенный член наследуется. В этом случае защищенный член базового класса становится защищенным членом производного класса, а значит, доступным для производного класса. Таким образом, используя модификатор доступа protected
, можно создать члены класса, являющиеся закрытыми для своего класса, но все же наследуемыми и доступными для производного класса.
Ниже приведен простой пример применения модификатора доступа protected
.
// Продемонстрировать применение модификатора доступа protected,
using System;
class B {
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 : B {
int k; // закрытый член
// члены i и j класса В доступны для класса D
public void Setk() {
k = i * j;
}
public void Showk() {
Console.WriteLine(k) ;
}
}
class ProtectedDemo {
static void Main() {
D ob = new D();
ob.Set(2, 3); // допустимо, поскольку доступно для класса D
ob.Show(); // допустимо, поскольку доступно для класса D
ob.Setk(); // допустимо, поскольку входит в класс D
ob.Showk(); // допустимо, поскольку входит в класс D
}
}
В данном примере класс В наследуется классом D, а его члены i и j объявлены как protected
, и поэтому они доступны для метода Setk().
Если бы члены i и j класса В были объявлены как private
, то они оказались бы недоступными для класса D, и приведенный выше код нельзя было бы скомпилировать.
Аналогично состоянию public
и private
, состояние protected
сохраняется за членом класса независимо от количества уровней наследования. Поэтому когда производный класс используется в качестве базового для другого производного класса, любой защищенный член исходного базового класса, наследуемый первым производным классом, наследуется как защищенный и вторым производным классом.