DDに関するウィキペディアの記事を読んでいて、最後にある「Java でのダブル ディスパッチと例」リンクにジャンプしました。次の Serializable の例の説明は、私にとってかなり混乱しているようです。
A a = new A();
ObjectOutputStream oos = new ObjectOutputStream();
oos.writeObject( a);
説明は次のとおりです。
A をシリアル化するために、
ObjectOutputStream
まずメソッドwriteObject( ObjectOutputStream oos)
が存在するかどうかを確認します。存在する場合は、それ自体を引数としてそのメソッドを呼び出します。次に、writeObject
メソッドは呼び出しを にディスパッチしますObjectOutputStream
(したがって、これは二重ディスパッチになります)。この非常に単純なコールバックを行う際に、ObjectOutputStream
は次のように述べています。「このストリームに状態を書き込む責任をあなたに委任します」その単純な選択を行うことで、ObjectOutputStream
はオブジェクトから切り離されましA
た。オブジェクトA
は、OK を返します。ここに、ストリームに書き込みたい状態があります。値がプリミティブの場合、write メソッドのオーバーロードによって処理できます。そうでない場合は、すべての有用な状態がストリームに配置されるまで、オブジェクト グラフの次のレベルで前後に続行できます。
説明されているのは舞台裏で起こっていることであり、提示されたコードではないため、説明が混乱している可能性があると思います。ここに私を混乱させる部分があります:
- 「
ObjectOutputStream
まず、メソッドwriteObject( ObjectOutputStream oos)
が存在するかどうかを確認します」。ObjectOutputStream
このメソッドは独自のメソッドであるため、このメソッドの存在を確認する必要があるのはなぜですか? - 「そうであれば、それ自体を引数としてそのメソッドを呼び出します」。
writeObject
のインスタンスをA
引数として呼び出しているように見えます。前の項目に戻ると、 のインスタンスで呼び出されているのに、なぜ argでwriteObject
署名を探すのでしょうか?ObjectOutputStream
A
- 「
writeObject
その後、メソッドは呼び出しをにディスパッチしますObjectOutputStream
(したがって、これを二重ディスパッチにします)」。繰り返しますが、writeObject
メソッドはクラスに属しているため、元の宛先のように見えるためObjectOutputStream
、これがどのように「にディスパッチされているか」を確認できません。ObjectOutputStream
ここで基本的な何かが欠けているだけですか、それともこれは不十分に書かれた/説明された例ですか? それが悪い例である場合は、ウィキペディアの記事をより良い例に変更したいので、お気軽に提案をお寄せください.
ありがとう。