我有一个班级,例如:
class BaseDataPoint
{
public double A;
public double B;
}
以及稍后的代码中,我需要将其扩展到
class ReportDataPoint : BaseDataPoint
{
public double C;
}
由于以上仅是一个示例,并且还有更多要复制的字段,是否可以(通过一些技巧)将BaseDataPoint
实例“转换为ReportDataPoint
而无需逐个字段手动复制?
如果我有
BaseDataPoint p1;
...
ReportDataPoint p2=(ReportDataPoint)p1; // FAILS at runtime
ReportDataPoint p3=new ReportDataPoint(p1); // can't compile
答案 0 :(得分:1)
您无法更改实例的类型;你需要创建一个新实例。此外,您不能使用强制转换语法,因为您不允许在继承链中添加自定义运算符。
因此;要么添加手动转换(通过添加像你的例子那样的构造函数,还是ComvertTo方法) - 或者有一些库可能有所帮助(也许AutoMapper,其中一些序列化lins可能也有帮助)。
答案 1 :(得分:1)
只需在ReportDataPoint中编写一个构造函数,以便p3的初始化将被编译。它可以工作,但它可以让你为新字段定义默认值。班级
BaseDataPoint
{
public double A;
public double B;
public BaseDataPoint(double A, double B)
{
this.A = A;
this.B = B;
}
}
class ReportDataPoint : BaseDataPoint
{
static const double defaultCValue = 0.0;
public double C;
public ReportDataPoint(double A, double B, double C)
:base(A,B){
this.C = C;
}
public ReportDataPoint(BaseDataPoint p,double C=defaultCValue) :
this(p.A, p.B, C)
{ }
}
...
BaseDataPoint p1=new BaseDataPoint(1,2);
ReportDataPoint p2=new ReportDataPoint(p1);
答案 2 :(得分:0)
不是我知道的。在这种情况下,我只需为ReportDataPoint实现一个接受BaseDataPoint实例并复制相关数据的构造函数。
答案 3 :(得分:0)
它仅取决于您创建的实例的类型。
如果您尝试:
BaseDataPoint p1 = new ReportDataPoint();
你以后可以投出它。
否则,您可以实现泛型util类以在实例类型之间传输字段值。一劳永逸。