C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 親子オブジェクト間のコピー


(過去ログ 119 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■69888 / inTopicNo.1)  親子オブジェクト間のコピー
  
□投稿者/ マー (1回)-(2014/02/06(Thu) 20:31:53)

分類:[C#] 

似たような質問は見かけたのですが解決に至ることができなかったため、知恵をお貸して下さい。

classA{int a; int b; void hoge();}
classB : A
{
string x;
bool sample();
}

上記のような親子関係のクラスに対して
B = A;
のような記述で、

B.a=A.a
B.b=A.b
と同じ結果を得たいです。

メンバ数が増える場合も考慮して、できれば1つづつ設定したくはないです。

A内で作成した
clone(B){B = this.MemberwiseClone()}

のようなshallowCopyメソッドではBへの型変換でエラーになってしまいました。

シリアライズ(MemoryStream)すればできるかもしれませんが、これ以外の方法で何か妙案はありませんでしょうか?
(個人的にPJ全体でこの処理のみ、シリアライズすることに違和感があるので)


よろしくお願いします。

引用返信 編集キー/
■69891 / inTopicNo.2)  Re[1]: 親子オブジェクト間のコピー
□投稿者/ tinq (7回)-(2014/02/06(Thu) 22:36:23)
リフレクションなどで動的にコピーをすることはできるかと思います。
ただし、ただでさえコストの高いコピーを、さらにコストの高いリフレクションでやるとパフォーマンスに影響が出かねません。
あまり詳しくないのですが、キャッシュしたり、式木なんかを使って最適化を試みないといけないかもしれません。

そんなことするぐらいならいっそ、コピーするコードを自動作成する方が手っ取り早いかもしれません・・・
引用返信 編集キー/
■69892 / inTopicNo.3)  Re[1]: 親子オブジェクト間のコピー
□投稿者/ Azulean (266回)-(2014/02/06(Thu) 22:37:06)
A のメンバーを一つの struct にまとめることがポイントになりそうです。
なお、B = A といった表現は無理です。メソッドで実現することになります。

class A
{
    protected struct Inner
    {
        public int a;
        public int b;
    }
    protected Inner _inner;

    protected void CopyFrom(A other)
    {
        _inner = other._inner;
    }
}

class B : A
{
    string x;
    public void CopyFromA(A other)
    {
        CopyFrom(other); // A.CopyFrom
        //TODO: 残りのメンバーについてどうするか定義すること
    }
}

引用返信 編集キー/
■69897 / inTopicNo.4)  Re[2]: 親子オブジェクト間のコピー
□投稿者/ マー (2回)-(2014/02/07(Fri) 16:12:31)
>tinq さん

リフレクションですか、あまり馴染みがないので、自作での対応は最終手段としたいと思います。


>Azulean さん

なるほど、プロパティを構造体で持つのですね。
これで子クラスから親インスタンスを親クラスに渡してコピーメソッドを呼び出すことで自身のプロパティに一括コピーできますね。


お陰様で目的の動作を実現できました。ありがとうございました。

引用返信 編集キー/
■69898 / inTopicNo.5)  Re[3]: 親子オブジェクト間のコピー
□投稿者/ マー (3回)-(2014/02/07(Fri) 16:13:39)
 
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -