2011-06-29 15 views
1

IXmlSerializableを不変クラスに実装しています。クラスを不変に保つために、メソッドを隠すために、ReadXml(XmlReader reader)メソッドをカプセル化し、代わりにクラスの新しいインスタンスを返す静的なReadXml()メソッドを使用するように、インターフェイスを明示的に実装しています。しかし、クラスを想定すると、私はIXmlSerializableを実装することを強制しています方法、ClassAと呼ばれるステートメントIXmlSerializable and Immutability

((ClassA)((IXmlSerializable)(ClassAObject)).ReadXml(reader))

が実際にIXmlSerializable.ReadXmlの内側に、私はすでに作成されたオブジェクトのパラメータに代入しています、以来ClassAObjectを変異させることを意味します。つまり、ClassAObjectは依然として変更不可能とみなされますか?ちょうど2つのインターフェイスが同じシグネチャを持つメンバーを定義するときに曖昧さを回避する - 明示的な方法を「隠す」ために意図されていないインタフェースを実装

答えて

1

。 「隠す」という側面も使えますが、コード内のミスを防ぐためにのみ、オブジェクトを明示的にキャストしなければなりません。つまり、自分が行っていることを知っていることを意味します。

を追加しました:しかし...多分あなたはReadXml()が呼び出された後、それを「ロック」で不変オブジェクトにかなり近い取得することができ、それに非常にさらに呼び出しが例外をスローします。したがって、オブジェクトは読み込まれた後も不変になります。それがパラメータなしのもの以外のコンストラクタによって構築されている場合、オブジェクトをロックしても大丈夫です。あなたが最初に不変性を望む理由に応じて、これはあなたのニーズに合うかもしれません。

0

私はあなたが、シリアル化されたオブジェクトデータを転送するためだけにパブリックgetter/setterを持つデータ転送オブジェクト(DTO)を考慮する必要があると思います。

関連する問題