【问题标题】:Overriding a Get/Set Property to Be Get-Only Still Lets You Set It将 Get/Set 属性覆盖为 Get-Only 仍然允许您设置它
【发布时间】:2017-06-27 16:38:05
【问题描述】:

考虑这个简短的例子:

class Program
{
    private abstract class PropertyExample
    {
        public virtual bool Property { get; set; }
    }

    private class GetOnlyProperty : PropertyExample
    {
        private bool property = false;
        public override bool Property => property;
    }

    static void Main(string[] args)
    {
        GetOnlyProperty example = new GetOnlyProperty();
        example.Property = true;
    }
}

即使我将 GetOnlyProperty 类中的 Property 覆盖为仅获取,我仍然可以在 Main() 中设置它。为什么会这样?

【问题讨论】:

  • 不要覆盖,标记为new
  • @MohamedAhmed 这仍然不会删除设置属性值的能力。
  • 他不能使用当前example类型为GetOnlyProperty的对象
  • @MohamedAhmed 你试过执行它吗?为我工作;这就是我提交问题的原因:)

标签: c# properties overriding accessor


【解决方案1】:

通过查看生成的 CIL 代码,您发现您正在通过将 getter 方法设置为在派生类中只读来覆盖它:

public override bool Property => property;

但是还是继承了setter,所以在设置属性的时候,仍然可以访问基类的setter方法。

【讨论】:

    【解决方案2】:

    语言不能让你做你试图在这里完成的事情。 Liskov 替换原则要求派生类可以在任何需要基类的地方替换。要使该属性成立,基类接口的每个可访问成员都必须存在并且可在派生类中访问。

    【讨论】:

    • 那么为什么编译器不发出警告或错误呢?也许是疏忽?
    • @DomnWerner -也许吧,尽管您选择的语法并不完全清楚您打算覆盖 setter 方法。
    • 你是说我只覆盖了吸气剂吗?我的理解是我正在覆盖属性本身。
    • @DomnWerner - 当您覆盖一个属性时,您必须指定要覆盖的部分 - getter 或 setter。您未覆盖的任何内容都将保持原样。
    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多