如何避免调用基类构造函数

时间:2016-11-03 15:36:08

标签: c# inheritance

我刚刚就如何最好地组织这里的继承提出了一些建议。我有一个类(下面)需要使用基本ExportData类中的大部分类,并且在其中的一些类:

public class ExtendedExportData : ExportData
{

    private tData _Data;
    private ResStrings _diaStrings;

    public ExtendedExportData(tData Data, ResStrings diaStrings)
        : base(tData, diaStrings)
    {
        _tData = Data;
        _diaStrings = diaStrings;

    }
}

在这种情况下,不需要调用基本构造函数,因为上面类中使用的基类方法都不需要初始化,构造函数只是在直接创建基类实例时才需要的用于其他(详细)目的。

如果我删除了基本构造函数,我在子类构造函数上得到一个错误,说基本构造函数不带0个参数。我怎么能避免这个?

这里是基类:

public class ExportData
{
    private tData _Data;
    private ResStrings _diaStrings;

    public ExportLines(tData Data, ResStrings diaStrings)
    {
        _Data = Data;
        _diaStrings = diaStrings;
    }
}

提前致谢。

5 个答案:

答案 0 :(得分:6)

总是使用基类的构造函数 - 但是当基类没有显式定义的构造函数时,C#将自动生成一个公共无参数构造函数。

同样,如果未在派生类中明确提及: base(...),则C#假定您要使用基类的无参数构造函数。

一旦定义了构造函数,就不会再自动生成无参数构造函数,因此 调用: base(...)

您可以通过向基类添加这样的构造函数来轻松更改此内容:

public class ExportData
{
    protected ExportData()
    {
    }
}

通过使此构造函数受保护,只有从ExportData继承的类才能使用此构造函数,并且它们不再需要包含: base(...)

答案 1 :(得分:1)

您可以在基类中始终使用无参数构造函数来完成所需的所有初始化,即:

public ExportData()
{
    //Initialising here
}

然后在你的例子中只调用base()

public ExtendedExportData(tData Data, ResStrings diaStrings)
    : base()

答案 2 :(得分:1)

你难道不能在ExportData类中创建一个空构造函数(public ExportData(){})吗?

否则你可以做here之类的事情。

答案 3 :(得分:1)

我知道这是一个老问题,但对于未来类似的问题解决方案查找器,我会写一些其他内容。

如果我正确地提出这个问题,那么就会有更优雅和共同的解决方案。只需使您的基类抽象。您仍然可以在继承期间调用基础构造函数。

可在此处找到更多信息:

Constructor of an abstract class in C#

答案 4 :(得分:0)

错误是因为必须实例化基类,并且您的基类没有默认构造函数。

如果基类中不需要基类中的功能,请查看继承体系结构。