Доступ к члену базового класса с модификатором protected - C#
Формулировка задачи:
Добрый день!
Читая MSDN наткнулся на статью по ссылке https://msdn.microsoft.com/ru-ru/library/bcd5672a.aspx .
Там описана фраза:
В результате работы программы получил вывод "123".
После этого попытался понять, действительно ли обращение к защищенному члену базового класса возможно только через экземпляр производного класса. В примере сверху это действительно так т.к. член базового класса не является статическим и не может использоваться в статическом методе Main(). Тем не менее, если в примере кода с MSDN вынести метод Main() в отдельный класс, то получить доступ к защищенному объекту родительского класса в не статическом методе можно просто по его имени:
При этом в коде выше можно создать экземпляр объекта класса В, и задать для него собственное значение для защищенной переменной "х". Но, естественно, это будут разные переменные.
В связи с этим весь мозг уже этой фразой вынес себе. Что на MSDN хотят сказать ей? Если читать дословно, то нет - не только через экземпляр производного класса (т.к. там минимум ничего не сказано про статические методы). Или я не правильно понимаю мысль, которую автор хотел донести? Может прямой доступ возможен, но является плохой практикой? Подскажите, что я упустил?
В интернете ничего подобного найти не смог. На этом форуме были вопросы по этой же статье, но они не смогли ответить на мой(
Член базового класса с модификатором protected доступен в производном классе только в том случае, если доступ осуществляется через тип производного класса.
После этой фразы приводится пример. Я создал тестовое консольное приложение в котором слегка изменил пример, чтобы его результат выводился на экран консоли (смысл это не поменяло). В результате получил следующий код и вывод: class A
{
protected int x = 123;
}
class B : A
{
static void Main()
{
A a = new A();
B b = new B();
// b.x = 10; - этот код примера заменил на две строки ниже:
Console.WriteLine(b.x);
Console.Read();
}
} class A
{
protected int x = 123;
}
class B : A
{
public void Meth()
{
Console.WriteLine(x); //никаких экземпляров класса В не создаю...
}
}
class Program
{
static void Main()
{
B b = new B();
b.Meth();
Console.Read();
}
}Решение задачи: «Доступ к члену базового класса с модификатором protected»
textual
Листинг программы
class A
{
private int x = 123;
static void Foo(A obj)
{
var val = obj.x;
}
void Bar(A obj)
{
var val = obj.x;
}
}