0

親を子にキャストできない理由について読んだことがあります。ANIMAL を DOG にキャストすることはできません。CATかもしれません。

しかし、ここに私の問題があります:

50 個のプロパティを持つデータレイヤーからデータ オブジェクトを受け取ります。ここで、このオブジェクトの子オブジェクトを作成し、プロパティを 1 つだけ追加しました。

私の関数では、オブジェクトの 51 個のプロパティすべてに、ベース オブジェクトの 50 個と余分な 1 個を入力したいと考えています。

そこで、親オブジェクトの 50 個のプロパティを子オブジェクトに「コピー」する方法を探しています。

それを行う方法はありますか?

4

4 に答える 4

2

これはおそらく、継承を使用したくない時期です。これを行うには、新しいタイプが何も継承せず、2つのプロパティがあります。1つは古いタイプ(現在親として使用することを検討しているもの)で、もう1つは新しいデータです。

于 2012-05-01T15:31:17.703 に答える
1

コピーコンストラクターに基づく一般的なソリューション(つまり、各プロパティの手動コピーと関連するメンテナンスの悪夢を伴わないアプローチ)には2つのアプローチがあります。

  1. 反射を使用して浅いコピーを作成します。 ここの例

  2. シリアル化を使用してディープコピーを作成します(ベースオブジェクトをメモリストリームにシリアル化し、それから派生オブジェクトにシリアル化します)。ここでの例の最初の部分では、シリアル化について説明しています(記事では両方のアプローチについて説明しています)。

于 2012-05-01T15:16:55.533 に答える
1

コピー コンストラクターを使用して、親オブジェクトに基づいて新しい子オブジェクトを作成できます。親クラスにコピー コンストラクターを作成し、新しい子を作成するときにそのコンストラクターを利用することもできます。

public Parent (Parent other)
{
   //copy other.Properties to this.Properties
}


public Child (Parent other) : base(other)
{
   //populate property 51
}

public Child (Child other) : base(other)
{
   //copy property 51
}

プロパティを既存のインスタンスにコピーする場合は、おそらくそのための別のメソッドを作成する必要があります。

public void Assimilate(Parent other)
{
   //copy parent's properties
}

public void Assimilate(Child other)
{
   //copy child's properties
}
于 2012-05-01T14:57:49.577 に答える
0

これはあなたの質問の側にあります (コピー コンストラクターの答えは 1 つの可能な方法のようです)。ただし、基本クラスからサブクラスにキャストすることはできますが、サブクラスからのキャストのように成功することが保証されていないことに注意してください。 -クラスをベースに。下記参照:

public class Base
{
}

public class Child1 : Base
{
}

public class Child2 : Base
{
}

main()
{
    Child1 ch1 = new Child1();
    Child2 ch2 = new Child2();

    Base myBase;
    myBase = ch1; // Always succeeds, no cast required
    myBase = ch2; // Always succeeds, no cast required

    // myBase contains ch2, of type Child2
    Child1 tmp1;
    Child2 tmp2;

    tmp2 = (Child2)myBase;   // succeeds, but dangerous
    tmp2 = mybase as Child2; // succeeds, but safer, since "as" operator returns null if the cast is invalid
    tmp1 = (Child1)myBase;   // throws a ClassCastException and tmp1 is still unassigned
    tmp1 = myBase as Child1; // tmp1 is now null, no exception thrown

    if(myBase is Child1)     
    {
        tmp1 = (Child1)myBase; // safe now, as the conditional has said it's true
    }
    if(myBase is Child2)     // test to see if the object is the sub-class or not
    {
        tmp2 = (Child2)myBase; // safe now, as the conditional has said it's true
    } 
}

それが理にかなっていることを願っています。やみくもにキャストすると、例外がスローされる可能性があります。キーワードを使用するasと、成功するか、null が返されます。isまたは、割り当てる前に if ステートメントとキーワードを使用して事前に「テスト」することもできます。

于 2012-05-01T15:11:52.913 に答える