簡體   English   中英

用於XML序列化的C#空基類構造函數…派生類無法調用?

[英]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構造函數保留為protectedinternalpublic意味着我失去了這一保證。

但是,如果我將基類的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM