2012-01-14 39 views
2

我有一个类,例如:上溯造型相关 - 类转换

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

不,我知道的。在这种情况下,我只需实现ReportDataPoint的构造函数,它接受BaseDataPoint实例并复制相关数据。

1

您不能更改实例的类型;你需要创建一个新的实例。此外,由于不允许在继承链中添加自定义运算符,因此无法使用此转换语法。

所以;或者添加一个手动转换(通过添加一个像你的例子一样的构造函数或者一个ComvertTo方法) - 或者有几个库可以帮助(也许AutoMapper,一些序列化lins可能也有帮助)。

0

它仅取决于您创建的实例的类型。

如果你尝试:

BaseDataPoint p1 = new ReportDataPoint(); 

您可以稍后投放。

否则,您可以实现通用的util类来在实例类型之间传输字段值。一次就好。

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);