我有一种情况,我想让普通属性在具有默认值的派生类中只读。 我使用关键字新以下列方式目的:将BaseClass属性更改为DerivedClass中的只读属性并覆盖
public abstract class BaseClass
{
public virtual string SomeInfo { get; set; }
}
public class DerivedClass1 : BaseClass
{
public new string SomeInfo => "ChildInfo1"; // C# 6.0 equivalent of { get { return "ChildInfo1"; } }
}
它工作正常,并new DerivedClass1().SomeInfo
不能被分配到 - 它是只读的。我知道,一个可以通过基类访问:
BaseClass b1 = new DerivedClass1();
b1.SomeInfo = "ChildInfo1 changed";
我只想无法用户意外更改,并通过基类,那将是目的,在这种情况下,它acceptible。
但是,如果派生类会是这样的:
public class DerivedClass2 : BaseClass
{
public override string SomeInfo => "ChildInfo2";
}
那么这个属性将可以使用,您可以更改貌似,但它不会改变的,我想知道为什么?
var d2 = new DerivedClass2();
d2.SomeInfo = "ChildInfo2 changed";
Console.WriteLine(d2.SomeInfo); // output: ChildInfo2
UPDATE:
我已经添加了新的答案作为第三个选择,可能是最好的。
*“我只想无法用户意外更改,并通过基类,那将是目的,在这种情况下,它acceptible” *如果程序员调用一个接受'BaseClass'参数的方法,程序员不知道该方法改变'SomeInfo'吗?无论如何,你提出的建议违反了[Liskov替代原则](https://en.wikipedia.org/wiki/Liskov_substitution_principle),应该被怀疑。 –
我在想这可能违反了LSP。 有没有其他(更好)的方式来实现这一点,而不违反它? – borisdj
那么,你可以创建一个只读的接口并传递它,但是当然这需要修改现有的方法,所以它可能不是一个选项。 –