我有一種情況,我想讓普通屬性在具有默認值的派生類中只讀。 我使用關鍵字新以下列方式目的:將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
那麼,你可以創建一個只讀的接口並傳遞它,但是當然這需要修改現有的方法,所以它可能不是一個選項。 –