Что происходит, когда вы наследуете защищенное свойство, поддерживаемое частным полем?

#c# #inheritance

#c# #наследование

Вопрос:

Я знаю, что это работает, но, похоже, не могу взять в толк, что происходит на самом деле:

 public class Base {
  private bool active;
  protected bool Active {
    get { return active; }
    set { active = value; }
  }
}

public class Child : Base {
  // ...
}
 

AFAIK, дочерний элемент не наследует private поля и Child.Active работает.

  • Означает ли это, что дочерний элемент все еще каким-то образом наследует знания этого поля?
  • Работает ли это по-другому (внутренне) при использовании Auto Property?

Комментарии:

1. В дочернем классе — при вызове Active используется реализация из Base класса, где используется частное поле. Точно так же, как в методах (вы можете использовать базовые методы, которые используют закрытые поля). Помните также: свойство реализуется как два метода, underhood. Когда вы переопределяете Active , вы не можете использовать backfield из базового класса.

Ответ №1:

В Child классе есть все члены, которые Base класс объявляет. Может ли он напрямую 1 обращаться к определенному элементу — это то, что изменяют модификаторы доступа.

Child Класс не может получить прямой доступ active , но это не значит, что у него нет active поля. Это просто недоступно для него. И код, который он наследует от Base этого, обращается к этому полю, независимо от того, является ли этот код свойством или методом, продолжает иметь доступ к полю.

Если Child выбрано переопределение Active , этот код по-прежнему не может напрямую обращаться к active полю. Но это может косвенно вносить изменения в поле, используя base.Active свойство из переопределения.


1 Вставьте все обычные предостережения относительно отражения или других трюков, которые могут позволить полностью доверенному коду вносить изменения в поля, которые в противном случае «защищены» модификатором доступа.

Комментарии:

1. Вы правы, у меня был краткий момент замешательства в отношении того, как на самом деле работает наследование…

Ответ №2:

‘protected’ никоим образом не переместился Active в дочерний элемент, он просто сделал его доступным Child . Поэтому Child можно вызвать Active , и содержимое Active может видеть значение поля.

Автоматические свойства работают таким же образом.