【问题标题】:What happens when you inherit a protected property backed by private field?当您继承由私有字段支持的受保护属性时会发生什么?
【发布时间】:2016-10-17 10:11:36
【问题描述】:

我知道它有效,但似乎无法理解实际发生的情况:

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

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

AFAIK,Child 不会继承 private 字段,而 Child.Active 有效。

  • 这是否意味着 Child 仍然以某种方式继承了该领域的知识
  • 使用自动属性时(内部)工作方式是否不同?

【问题讨论】:

  • 在子类中 - 当您调用 Active 时,将使用 Base 类中的实现,其中使用了私有字段。就像在方法中一样(您可以使用使用私有字段的基本方法)。还要记住:属性被实现为两种方法,underhood。当您覆盖 Active 时,您不能使用基类中的后场。

标签: c# inheritance


【解决方案1】:

Child 类具有 所有 Base 类声明的成员。是否可以直接1访问特定成员是访问修饰符的变化。

Child 类不能直接访问active,但这并不意味着它没有 active 字段。它只是无法访问。并且它继承自 Base代码 访问该字段,无论该代码是属性还是方法,都可以继续访问该字段。

如果Child 选择覆盖 Active那个代码仍然不能直接访问active字段。但它可以通过使用覆盖内的base.Active 属性间接更改字段。


1插入所有关于反射或其他技巧的常见警告,这些技巧可能允许完全受信任的代码对访问修饰符“保护”的字段进行更改。

【讨论】:

  • 你说得对,我对继承的实际工作原理有片刻的困惑......
【解决方案2】:

'protected' 并没有以任何方式将 Active 移动到 Child 中,它只是让 Child 可以访问它。所以Child可以调用ActiveActive的内容可以看到字段值。

自动属性的工作方式相同。

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多