考虑此简短示例:
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替代原则要求在预期基类的任何地方都可以替代派生的类。为了使该属性保持真实,必须存在基类接口的每个可访问成员,并且可以在派生类中访问。