不确定这里是否需要代码示例,但这里有。
在基类中我有:
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构造函数正确初始化类。意思是,我希望它们初始化,以便有序列化的东西。保留空构造函数protected
,internal
或public
意味着我将失去此保证。
但是如果我创建基类null构造函数private
,那么我不能在派生类中使用null构造函数,因为基类null构造函数是不可访问的。即使我从派生类'null构造函数中删除“: base()
”,我也会收到这些错误。代码无法编译所以我必须接受一个非private
null构造函数,即使我不想要一个;它将风险引入我的代码库中。
通过[Serializable]
或每个派生类中的接口ISerializable
对序列化进行编码似乎是浪费,低效和冒险的。似乎不必要的劳动与代码重用和继承相悖。
可能我在这里遗漏了一些关于序列化的明显或基本的东西。但到目前为止还没有找到答案。
后续注释
我想确保派生类被强制调用非null构造函数。我正在处理的项目中有数百个派生类,其中没有显式传递给基类非null构造函数。
所以我在哪里
public DerivedClass(<some parameters>)
{
[...]
}
这被编译为
public DerivedClass(<some parameters>) : base()
{
[...]
}
但我希望将其作为编译时错误抛出。
我想强制推导显式,或者抛出编译器错误:
public DerivedClass(<some parameters>) : base(<some parameters>)
{
[...]
}
似乎需要为构造函数提供一个新的访问修饰符。
热烈欢迎任何建议......
答案 0 :(得分:0)
您应该明确地看一下受保护的修饰符。
如果您创建受保护的构造函数,则只能通过继承类来调用构造函数,并且:base()将再次运行。