Если говорить о стороне C #, если у вас есть элемент данных (поле или свойство), который не является общедоступным, но полезен для дочерних классов и должен быть доступен как для чтения, так и для записи, затем объявите этот элемент как защищенный.
Если член должен быть прочитан подклассами, но не записан, вы можете определить член как свойство, которое защищено, но с частным установщиком:
//as of C# 3.0 this can also be an auto-property
private string myValue;
protected string MyValue
{
get{return myValue;}
private set{myValue = value;}
}
Это делает MyValue полностью скрытым от классов внеиерархия наследования и доступ только для чтения для подклассов;только сам суперкласс может установить значение.Это было бы эквивалентно закрытому полю с защищенным методом получения и методом частного установки.
В общем, как разработчик суперкласса, вы сами должны определить, как подклассы должны иметь возможность использовать то, что выпредоставлять.Если вы делаете что-то защищенное, предположите, что подклассы будут делать все, что позволяет им «защищенный».И в C #, и в Java есть методы, с помощью которых вы можете независимо контролировать видимость доступа для чтения и записи.