覆盖get/set属性仅仅是允许您设置它



考虑此简短示例:

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()中进行设置。为什么这可能?

通过查看生成的CIL代码,事实证明,您仅通过在派生类中读取它来超越Getter方法:

public override bool Property => property;

,但仍在继承设置器,因此,当您设置属性时,您仍然可以访问基类的设置方法。

语言无法让您在这里尝试完成的工作。Liskov替代原则要求在预期基类的任何地方都可以替代派生的类。为了使该属性保持真实,必须存在基类接口的每个可访问成员,并且可以在派生类中访问。

相关内容

最新更新