2012-01-14 6 views
2

私はクラスは、例えば有する:アップキャスト関連 - クラス変換

class BaseDataPoint 
{ 
    public double A; 
    public double B; 
} 

、後にコードで、Iは、上記ので

class ReportDataPoint : BaseDataPoint 
{ 
    public double C; 
} 

にそれを拡張する必要は一例であり、コピーするフィールドが他にもたくさんありますが、手動でフィールドをコピーするのではなく、ReportDataPointBaseDataPointインスタンスを「変換」することは可能ですか(いくつかのトリックを介して)?

私は私の知っていることを

BaseDataPoint p1; 
... 
ReportDataPoint p2=(ReportDataPoint)p1; // FAILS at runtime 
ReportDataPoint p3=new ReportDataPoint(p1); // can't compile 

答えて

0

をしていない場合。このような場合は、単にBaseDataPointインスタンスを受け取り、関連するデータをコピーするReportDataPointのコンストラクタを実装します。

1

インスタンスのタイプを変更することはできません。新しいインスタンスを作成する必要があります。さらに、継承チェーン内にカスタム演算子を追加することができないため、キャスト構文を使用することはできません。

So; (あなたの例のようなコンストラクタを追加する、または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); 
関連する問題