【问题标题】:How to avoid calling the base class constructor如何避免调用基类构造函数
【发布时间】:2017-03-17 06:44:20
【问题描述】:

我只是在获得关于如何最好地组织继承的一些建议。我有一个类(如下)需要使用基本 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;
    }
}

提前致谢。

【问题讨论】:

  • 请显示基类ExportData只需为其添加一个默认构造函数
  • 您的代码确实实例化了基类的一个实例。这就是继承的意思——ExtendedExportData ExportData 的一个实例。如果ExportData 的字段对ExtendedExportData 没有意义,则说明您存在设计错误
  • 您可以在 ExportData 类中创建空的受保护构造函数,然后从 ExtendedExportData (:base()) 调用它。

标签: c# inheritance


【解决方案1】:

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

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

一旦定义了构造函数,就不会再自动生成无参数构造函数了,所以你必须调用: base(...)

您可以通过将这样的构造函数添加到基类来轻松更改这一点:

public class ExportData
{
    protected ExportData()
    {
    }
}

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

【讨论】:

  • 这很好,我不知道自动创建了无参数构造函数,这现在解释了很多:) 我已将受保护的无参数构造函数添加到基类中,现在一切都很好。
【解决方案2】:

你总是可以在基类中有一个无参数的构造函数来完成它需要的所有初始化,即:

public ExportData()
{
    //Initialising here
}

然后在您的示例中,只需调用 base()

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

【讨论】:

  • 谢谢,看来你基本上是正确的,但经过进一步测试,我发现使用基类中的无参数构造函数,你不需要在继承类中调用:base()。
  • @DanHall 我在你接受的答案中发现了这一点,因此相应地支持了他的答案,但看到我的也是正确的,只是更明确,我把它留在了周围
  • 再次感谢,为了清楚起见,有点矫枉过正的代码没有错,所以你的答案接近被接受的答案。
【解决方案3】:

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

否则,您可以执行here 之类的操作。

【讨论】:

  • 这很好,我只是将它添加为受保护的构造函数并将其留空,仅在被继承时使用。谢谢。
【解决方案4】:

我知道这是个老问题,但对于未来类似问题解决方案的发现者,我会写点别的。

如果我正确理解了这个问题,还有更优雅和通用的解决方案。只需使您的基类抽象。您仍然可以在继承期间调用基本构造函数。

更多信息可以在这里找到:

Constructor of an abstract class in C#

【讨论】:

    【解决方案5】:

    这个错误是因为基类总是必须被实例化,而你的基类没有默认构造函数。

    如果您的基类中有基类不需要的功能,请检查您的继承架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多