#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
может видеть значение поля.
Автоматические свойства работают таким же образом.