[英]C# null base-class constructor for XML Serialisation … that derived classes cannot call?
不知道這里是否需要代碼示例,但是可以。
在基類中,我有:
public class BaseClass
{
public BaseClass()
{
// empty constructor for XML serialisation
}
public BaseClass(<some parameters>)
{
// initialise correctly
[...]
}
// force base classes to implement Xml serialisation
protected abstract XmlDocument AsXmlDocument();
}
然后派生的類有
public class DerivedClass : BaseClass
{
public DerivedClass() : base()
{
// null constructor
}
public override XmlDocument AsXmlDocument()
{
// serialization code
[...]
}
}
我想將null構造函數設為private
因此沒有別的可以調用它。 這樣可以通過非null構造函數正確初始化類。 意思是,我希望它們初始化,以便可以序列化一些東西。 將null構造函數保留為protected
, internal
或public
意味着我失去了這一保證。
但是,如果我將基類的null構造函數private
,則在派生類中不能有null構造函數,因為無法訪問基類的null構造函數。 即使從派生類的null構造函數中刪除“ : base()
”,我也會收到這些錯誤。 代碼無法編譯,因此即使我不需要一個非private
null構造函數,我也必須接受。 這樣做會在我的代碼庫中引入風險。
在每個派生類中通過[Serializable]
或接口ISerializable
進行[Serializable]
編碼似乎是浪費,低效和冒險的。 似乎是不必要的工作,與代碼重用和繼承背道而馳。
可能我在這里缺少關於序列化的明顯或基本的知識。 但是到目前為止,還沒有找到答案。
后續說明
我想確保派生類被強制調用非null構造函數。 我正在處理的項目中有數百個派生類,在該類中沒有顯式傳遞給基類的非null構造函數。
所以我有
public DerivedClass(<some parameters>)
{
[...]
}
這被編譯為
public DerivedClass(<some parameters>) : base()
{
[...]
}
但我希望將此作為編譯時錯誤拋出。
我想強制派生明確地這樣,或者拋出編譯器錯誤:
public DerivedClass(<some parameters>) : base(<some parameters>)
{
[...]
}
似乎需要為構造函數提供一個新的訪問修飾符。
熱烈收到任何建議...
您應該明確地看一下protected修飾符。
如果您創建一個受保護的構造函數,則只能從繼承類中調用該構造函數,並且:base()將再次起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.