阻止访问基类的默认构造函数

时间:2014-02-26 07:26:22

标签: c# .net inheritance serialization default-constructor

我有一个基类和一个派生类。由于这两个类都是可序列化的,因此需要具有默认构造函数。但我想阻止访问基类的默认构造函数,因为如果有人使用默认构造函数创建对象,它可能会导致问题。我不能把它作为私有或内部,因为它是基类。将其设为私有会在派生类中显示错误。错误是base没有任何无参数构造函数。如何防止访问基类的默认构造函数?以下是示例代码。

[Serializable]
public class Test1()
{
    public Test1()
    {

    }

    public Test1(int i, int j)
    {

    }

    public Test1(int i, int j, int k)
    {

    }
 }

[Serializable]
public class Test2():Test1
{
    public Test2():base()
    {

    }

    public Test2(int i, int j):base(i,j)
    {

    }

    public Test2(int i, int j, int k):base(i,j,k)
    {

    }
 }

3 个答案:

答案 0 :(得分:1)

使用protected

  

protected关键字是成员访问修饰符。受保护的成员   可以在其类和派生类实例中访问。为一个   protected与其他访问修饰符的比较。

public class Test1()
{
    protected Test1()
    {

    }

    public Test1(int i, int j)
    {

    }

    public Test1(int i, int j, int k)
    {

    }
 }

答案 1 :(得分:1)

继续在Constructor中抛出异常,因为Serializer 不会使用它。如果有人使用他是罪魁祸首:p

[Serializable]
public class Test1()
{
    public Test1()
    {
        throw new InvalidOperationException("Default constructor shouldn't be used")
    }

    public Test1(int i, int j)
    {

    }

    public Test1(int i, int j, int k)
    {

    }
 }

答案 2 :(得分:0)

我为这个案子搜查了几个问题。几乎拥有它的一个解决方案是使用过时的anotaion和paramater来实现构建失败。

...
    [Serializable]
    public class Test2():Test1
    {
        [Obsolete("Don't use the default constructor.", true)]
        public Test2():base()
        {

        }
...