我有一個C#基類的枚舉屬性,我想對所有派生類有效地只讀,除了一個(我需要該屬性是可讀寫的)。如何使派生類中的只讀屬性可寫?
我枚舉聲明,像這樣:
enum Visibility { Public, Shared, Private }
(枚舉成員的名字都無關,與C#可見性修飾符,順便!)
起初,我以爲我能申報基類的屬性,像這樣:
abstract class DataViewBase
{
public Visibility Visibility { get; protected set; }
}
,然後更改派生類的聲明:
sealed class FooDataView : DataViewBase
{
public Visibility Visibility { get; set; }
}
從而使二傳手公衆開放,但我應該意識到這個隱藏基能見度財產,並生成一個編譯器警告。添加new
關鍵字(即public new Visibility ...
)擺脫了警告,但FooDataView上的屬性實際上成爲一個全新的屬性,與基類中的屬性沒有任何關聯。因此,如果我這樣做:
var foo = new FooDataView();
foo.Visibility = Visibility.Shared;
Console.WriteLine(foo.Visibility); // Shared
var casted = (DataViewBase) foo;
Console.WriteLine(casted.Visibility); // Public
兩個能見度屬性值不同,這是不是我想要的。
我最終圍繞這個工作通過聲明的屬性,像這樣:
sealed class FooDataView : DataViewBase
{
public new Visibility Visibility
{
get { return base.Visibility; }
set { base.Visibility = value; }
}
}
這確保了兩個能見度性能保持「同步」。
但是,在完成了所有這些後,我想知道是否有另一種方法來完成我想要的功能(根據問題標題),因爲我的解決方案似乎有些不雅。我想不出任何其他明顯的解決方案。
「更改派生類的聲明」 - 在.NET中,這通常與聲明「全新」成員同義。您可以分別使用'virtual'和'override'關鍵字來更改成員的*行爲*(同時保留*界面*)。然而,在你的情況下,我會準確地建議你最終自己做了什麼,讓所有類繼承只讀屬性,並通過一個特定類中的可寫屬性來映射該屬性。你可能想要自己添加一個答案,並在一段時間後將自己的答案標記爲已接受。 –