请帮忙! 我有一些继承的类,如下所示:
public class DataTableA : DataTable
{
// ...
public DataTable CloneMe()
{
DataTable table = this;
return table.Clone();
}
}
public class DataTableB : DataTableA
{
// ...
}
public class DataTableC : DataTableB
{
// ...
public void Test()
{
DataTable table = this.CloneMe();
}
}
当我调用方法Test(类DataTableC)时,会调用以下构造函数:
但为什么呢?我期望只调用“DataTable的构造函数”。
答案 0 :(得分:1)
通常,在创建类型X
的实例,并且该类型具有基类Y
时,Y
的构造函数将在{{1}的构造函数之前调用}}。任何长度的继承都会继续这种想法。
因此,在您的情况下,为了创建X
的实例,需要首先调用DataTableC
的构造函数。在调用DataTableB
的构造函数之前,需要首先调用DataTableB
的构造函数,这需要DataTableA
的构造函数运行。
这是创建新实例时的正常行为。但是你在这里使用DataTable
,那么你究竟在哪里创建DataTable.Clone
的新实例?
这归结为implementation of DataTable.Clone
。在内部,它使用DataTable.CreateInstance
method,它本身使用反射来创建当前类型的新实例:
DataTableC
在您的情况下,由于当前类型为protected virtual DataTable CreateInstance() {
return (DataTable) Activator.CreateInstance(this.GetType(), true);
}
,因此正在创建DataTableC
的新实例,这解释了为什么调用所有这些构造函数。
答案 1 :(得分:0)
public DataTable CloneMe()
{
return new DataView(this, "0=1", null, DataViewRowState.CurrentRows).ToTable();
}
此方法克隆DataTable(或派生类的任何对象),而不创建DataTableC(DataTableA,DataTableB)对象。仅显式DataTable对象。