И объект-представитель класса B в принципе НЕ может получить доступ к частным данным-членам и функциям-членам класса A. Косвенное влияние на такие данные-члены и функции-члены лишь через публичные функции класса A.
Следует иметь в виду ещё одно важное обстоятельство.
Если упорядочить все (известные) спецификаторы доступа C# по степени их открытости:
Максимальная степень открытости
Минимальная степень открытости
public
…
private
то наследуемый класс не может иметь более открытый спецификатор доступа, чем его предок.
protected class A
{
:::::::::
}
public class B:A // Неправильное наследование.
{
:::::::::
}
Используем ещё один спецификатор доступа – protected. Этот спецификатор обеспечивает открытый доступ к членам базового класса, но только для производного класса!
public class A
{
:::::::::
protected int val3_A = 0;
}
public class B:A
{
:::::::::
public void fun1_B (String str)
{
:::::::::
this.val3_A = 125;
}
}
static void Main(string[] args)
{
:::::::::
//b0.val3_A = 125; // Это член класса закрыт для внешнего использования!
}
Защищённые члены базового класса доступны для ВСЕХ прямых и косвенных наследников данного класса.
И ещё несколько важных замечаний относительно использования спецификаторов доступа:
в C# структуры НЕ поддерживают наследования. Поэтому спецификатор доступа protected в объявлении данных-членов и функций-членов структур НЕ ПРИМЕНЯЕТСЯ,
спецификаторы доступа действуют и в рамках пространства имён (поэтому и классы в нашем пространстве имён были объявлены со спецификаторами доступа public). Но в пространстве имён явным образом можно использовать лишь один спецификатор – спецификатор public, либо не использовать никаких спецификаторов.