2012-01-14 40 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);