1

IXmlSerializable不変クラスに実装しています。クラスを不変に保つために、メソッドを非表示にするためにインターフェイスを明示的に実装し、ReadXml()メソッドをカプセル化してReadXml(XmlReader reader)代わりにクラスの新しいインスタンスを返す静的メソッドを使用しています。ただし、クラスが呼び出されたと仮定すると、ClassA実装を余儀なくされている方法はIXmlSerializable、ステートメントが

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

内部ではClassAObjectIXmlSerializable.ReadXml既に作成されたオブジェクトのパラメーターに割り当てています。ということは、ClassAObjectまだ不変と見なすことができますか?

4

2 に答える 2

1

いいえ。

インターフェイスを明示的に実装することは、メソッドを「隠す」ことを意味するものではありません。2つのインターフェイスが同じ署名を持つメンバーを定義するときのあいまいさを回避するためだけです。「非表示」の側面も使用できますが、それは自分のコードの間違いを防ぐためだけです。オブジェクトを明示的にキャストする必要があります。つまり、自分が何をしているかがわかります。

追加:ただし...呼び出された後に不変オブジェクトを「ロック」することで、不変オブジェクトにかなり近づくことができる可能性があるReadXml()ため、それをさらに呼び出すと例外がスローされます。したがって、オブジェクトは読み取られた後、不変になります。パラメータのないコンストラクター以外のコンストラクターによってオブジェクトが構築された場合は、オブジェクトもロックすると便利です。そもそも不変性が必要な理由によっては、これがニーズに合う可能性があります。

于 2011-06-29T10:51:50.697 に答える
0

シリアル化されたオブジェクト データを転送するためだけにパブリック ゲッター/セッターを持つデータ転送オブジェクト (DTO) を検討する必要があると思います。

于 2011-11-12T07:28:10.213 に答える