2

これはほとんどの人にとって簡単な質問だと思いますが、私がWebで見た答えはどれも私が必要としているものではありません。したがって、基本クラスとそれを継承する別のクラスがあります。

public class MyBase
{
    public DateAdded { get; set; }
}

public class MySecond : MyBase
{
    public MySecond(MyBase prototype) 
    {
        this = (MySecond)prototype; // this is read-only and does not work
    }

    public DateDeleted { get; set; }
}

MyBaseをインスタンス化し、MySecondの別のインスタンスにプロトタイプとして提供し、MySecondが値を1つずつ明示的に転送せずに、プロトタイプのすべての値を取得するようにするにはどうすればよいですか?

4

2 に答える 2

9

基本的にはできません。リフレクションを使用して自動化された方法で値をコピーすることもできますが、それでも値を1つずつコピーすることになり、コピー方法(たとえば、ディープコピーを作成する必要があるかどうか)をあまり制御できません。 )。

dasblinkenlightが述べているように、それが常に適切であるとは限らない場合を除いて、各クラスに独自のプロパティのコピーを担当させる方が適切な場合があります。

それ自体がのインスタンスであるprototypeかどうかを確認し、インスタンスである場合はそこからプロパティをコピーすることをお勧めします。MySecond

また、継承の代わりに合成を使用し、クラスを不変にしようとすると、多くの場合、この種のことは不要または些細なことになります。常に適切であるとは限りませんが、継承の乱用はかなり多く見られます。

于 2012-08-23T17:41:44.330 に答える
7

コピーを自動的に行うことはできませんが、共有スポット、つまりMyBaseクラスのコンストラクターで行うことができます。prototypeこのように、次のように、ベースコンストラクターのパラメーターとしてを渡すと、すべての派生クラスが同じ共有コードを使用できるようになります。

public class MyBase {
    public DateAdded { get; set; }
    public MyBase() {
    }
    public MyBase(MyBase other) {
        // Do the copying here
    }
}

public class MySecond : MyBase {
    public MySecond(MyBase prototype) : base(prototype) {
    }

    public DateDeleted { get; set; }
}

編集(コメントに応じて)

のソースにアクセスできない場合はMyBase、次のように、コピーを実行する静的ヘルパーメソッドを作成できます。

internal static class MyBaseHelper {
    public static void CopyFromBase(this MyBase target, MyBase source) {
        target.DateAdded = source.DateAdded;
    }
}

これで、次のように派生クラスで使用できます。

public class MySecond : MyBase {
    public MySecond(MyBase prototype) {
        this.CopyFromBase(prototype);
    }

    public DateDeleted { get; set; }
}
于 2012-08-23T17:43:28.350 に答える