我刚刚就如何最好地组织这里的继承提出了一些建议。我有一个类(下面)需要使用基本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;
}
}
提前致谢。
答案 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)
我知道这是一个老问题,但对于未来类似的问题解决方案查找器,我会写一些其他内容。
如果我正确地提出这个问题,那么就会有更优雅和共同的解决方案。只需使您的基类抽象。您仍然可以在继承期间调用基础构造函数。
可在此处找到更多信息:
答案 4 :(得分:0)
错误是因为必须实例化基类,并且您的基类没有默认构造函数。
如果基类中不需要基类中的功能,请查看继承体系结构。