【问题标题】:Inherited auto-implemented property with private setter使用私有 setter 继承自动实现的属性
【发布时间】:2015-10-03 09:45:21
【问题描述】:

我有一个基类和一个派生类。每个都具有相同的属性,具有 private 设置器,因此可以通过类内的某些逻辑设置值。

class First
{
    internal virtual int Value { get; private set; }

    void SetValue(int toValue)
    {
        Value = toValue;
    }
}

class Second : First
{
    internal override int Value { get; private set; }

    void SetValue(int toValue)
    {
        Value = toValue;
    }
}

这会导致编译器错误:

属性或索引器 ... 不能在此上下文中使用,因为 set 访问器不可访问。

为什么会这样,我怎样才能实现我想要做的事情?这对于自动实现的属性是不可能的吗,换句话说,我是否必须使用支持字段?

【问题讨论】:

  • 你真正想要达到什么目的?拥有同名的独立属性对我来说听起来像是灾难的秘诀。
  • 这就是虚拟成员背后的重点:能够在派生类中用更具体的逻辑覆盖它们。我不确定我是否遵循你的推理。
  • 但是你没有具体的逻辑——你只有另一个自动实现的属性。而且,如果您将属性视为公共获取和私有集,那么您不能覆盖私有方法是完全有道理的。再说一次,你真正想要达到什么目的?你能举一个更有意义的例子吗?

标签: c# inheritance properties access-modifiers


【解决方案1】:

Second 将无法从 First 获取 set 的值 Value,因为 Values 设置器是 private。如果您需要您的子类能够设置它,则它需要在基类中为 protected

【讨论】:

  • 我打赌我已经看过大约 20 个关于此问题的问答......受保护的访问权限修改似乎被忽略了。
【解决方案2】:

Getter 和 Setter 基本上是方法。你不能覆盖你看不到的方法。在这种情况下,virtual 仅适用于 getter,因为 virtual private 是不允许的。

不仅仅是看不到使用它,你根本无法覆盖它。

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多