Ответы по Технологии программирования / Доступ к членам класса и наследование
.docxНаследование класса не отменяет ограничения, связанные с закрытым доступом. Таким образом, несмотря на то, что производный класс включает все члены базового класса, он не может получить доступ к тем из НИХ, которые объявлены закрытыми.
С#-программисты обычно предоставляют доступ к закрытым членам класса посредством открытых методов или путем превращения их в свойства.
Во многих случаях используют защищённые члены классов. Защищенным является член, который открыт для своей иерархии классов, но закрыт вне этой иерархии.
Защищенный член создается с помощью модификатора доступа protected. При объявлении protected-члена он, по сути, является закрытым, но с одним исключением. Это исключение вступает в силу, когда защищенный член наследуется. В этом случае защищенный член базового класса становится защищенным членом производного класса, а следовательно, и доступным для производного класса. Таким образом, используя модификатор доступа protected, можно создавать закрытые (для "внешнего мира") члены класса, но вместе с тем они будут наследоваться с возможностью доступа со стороны производных классов.
// Демонстрация использования защищенных членов класса.
usingSystem;
class В {
protectedint i, j; // Закрыт внутри класса В,
//но доступен для класса D.
public void set(int a, int b) {
i = a;
j = b;
}
public void show() {
Console.WriteLine(i + " " + j) ;
}}
classD : В {
int k; // Закрытыйчлен.
// Класс D получаетдоступ к членам i и j класса В.
public void setk() {
k = i * j ;
}
public void showk() {
Console.WriteLine(k) ;
}}
classProtectedDemo {
public static void Main() {
D ob = new D();
ob.set(2, 3); // OK, так как D "видит" В-члены i и j .
ob.show(); // OK, так как D "видит" В-члены i и j .
ob.setk(); // OK, так как это часть самого класса D.
ob.showk(); // OK, так как это часть самого класса D.
}}
Поскольку в этом примере класс в наследуется классом D и члены i и j объявлены защищенными в классе В (т.е. с использованием модификатора доступа protected), метод setk() может получить к ним доступ. Если бы члены i и j были объявлены в классе в закрытыми, класс D не имел бы к ним права доступа, и программа не скомпилировалась бы.
Подобно модификаторам public и private модификатор protected остается со своим членом независимо от реализуемого количества уровней наследования. Следовательно, при использовании производного класса в качестве базового для создания другого производного класса любой защищенный член исходного базового класса, который наследуется первым производным классом, также наследуется в статусе защищенного и вторым производным классом.