8

そのViewModelのプロパティの編集のキャンセルをサポートするために、一部のViewModelが継承するIEditableObjectを実装するジェネリッククラスを実装することを検討してきました。これの主な用途は、[OK]ボタンと[キャンセル]ボタンがあるWPFのモーダルダイアログです。

オンラインで次の実装を見つけました。

これは私には非常に複雑に思えますが、それらが提供する機能の一部が欠けているかどうかはわかりません。1つは、ディープコピーをサポートしていないため、私の世界では、MemberwiseCloneを使用してシャローコピーを実行できます。何かのようなもの:

private Item backupCopy;
private bool inEdit;

public void BeginEdit()
{
    if (inEdit) return;
    inEdit = true;
    backupCopy = this.MemberwiseClone() as Item;
}

public void CancelEdit()
{
    if (!inEdit) return;
    inEdit = false;
    this.Name = backupCopy.Name;
}

public void EndEdit()
{
    if (!inEdit) return;
    inEdit = false;
    backupCopy = null;
}

この例はもちろん、ViewModelsが継承するための一般的な抽象基本クラスに含まれている必要がありますが、アイデアは得られます...

ここでの違いは何ですか?ディープコピーをサポートしない以外に、私のアプローチの欠点は何ですか?ディープコピーをサポートするためにどのように変更しますか(まだ必要かどうかはわかりません)?

アップデート:

この記事は、リフレクションを使用した私の実装よりも優れた実装を示していることがわかりました。私がリンクした他の2つの記事よりもはるかに簡単です:

ディープコピーをサポートするためにこれをどのように拡張できますか?

4

1 に答える 1

3

実際、MemberwiseClone浅いコピーを適用します。シャローコピーを適用すると、オブジェクト内の参照型オブジェクト(一部の参照型プロパティなど)は作成されず、参照のみがコピーされます。したがって、各インスタンスは同じオブジェクトを参照します。

ディープコピーでは、オブジェクト内の参照型オブジェクトもコピーされます。

アイテムのリストを考えてください。浅いコピーを適用すると、同じオブジェクトを指す2つのリストが作成されます。ディープコピーを適用すると、新しいリスト用に新しいオブジェクトが作成されます。

浅いコピーではなく、深いコピーを使用することをお勧めします。リストの例について考えてみてください。浅いコピーを適用し、コピーされたリストの要素を変更した場合、すべての変更を元に戻すことはできません。コピーされたリストは元のリストと同じ要素を共有するためです。

于 2013-02-21T08:30:04.147 に答える