繁体   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