2017-03-07 5 views
2

私はいくつかのAssign()プロシージャを見て、割り当て中にイベントが一般的に無視されることに気付きました。たとえば、TBitmap割り当てメソッドはOnChangeイベントをコピーしません。逢引中にコピー - となることはありません - 私はそれが割り当て時にイベントをコピーしないために一般的に受け入れられている方法だと、すべてのユーザーがイベントがされることはありませんという事実に依存している場合、すなわちをDelphi - イベントがAssign()プロシージャにコピーされないのはなぜですか?

  1. を知りたいですか?
  2. 割り当て中にイベントが(少なくとも一般的に)コピーされないのはなぜですか?
  3. おそらく私は間違っています。状況によってはイベントが完全にコピーされる可能性がありますか?

よろしく

+1

この決定を行うのはコンポーネント作成者次第です。私はイベントが「割り当て」の一部としてコピーされないのは、非常に緩やかな方法で、状態ではなく行動を定義するためであると考えられます。もう一つの動機は、イベントが暗黙的に別のオブジェクトへの参照を含んでいるということです。 'Assign'は参照ではなく値をコピーすることが期待されます。もしあなたが「A.Assign(B);」と書いたら、それは非常に困っているだろう。 B.Free'を実行し、 'B'で実装されたイベントハンドラへの古い参照を残して' A'を残しました。 –

+1

@DavidHeffernanおそらく、Bのイベントハンドラに保持されているメソッド参照はそれに属していません...それはむしろ目的を敗北させるでしょうか?これらは一般に、Bを設定した外部オブジェクトに属するメソッドへの参照ではありませんか? –

+2

それはしばしばそうである。おそらく、私のコードサンプルが単純すぎたのかもしれません。しかし、陳腐な参照の非常に明確な危険性があります。 –

答えて

5

私はこれを指示「ルール」を認識してないんだけど、私はあなたが正しいですし、それが起こることはほとんどないと思います。 AssignはTPersistentで導入されているため、コンポーネントの作成者が決定しますが、実際にオーバーライドを実装するまでは何もしません。実際には例外がスローされます(XはYに代入することはできません)。

これがAssignのパワーです。すべての割り当てがカスタム実装であるため、割り当て元は同じタイプのコンポーネントである必要はありません。あなたのTBitmapの例では、それをTPictureに割り当てることができますし、他のタイプのグラフィックスをTBitmapに割り当てて、それらのグラフィックスがビットマップのキャンバス上に描画されるようにすることさえできます。

多くの場合、私が遭遇したケースでは、割り当てはそれに関するものです:あるオブジェクトのデータの割り当て(場合によっては状態の変換)

イベントが異なります。イベントハンドラを持ってそれを管理するのは、オブジェクトに依存しません。サブスクライバが他のオブジェクトにサブスクライブしたいという決定を下すことは、オブジェクトの仕事ではありません。イベントハンドラへの/ポインタの値は、オブジェクトの(関連する)データの一部ではありません。

他の人が聞いたことがあるだけで、他のオブジェクトも聴きたい場合は、それらのオブジェクトにもイベントハンドラを割り当てる必要があります。

私にとっては、イベントがコピーされないということは理にかなっています。自分で作成したAssign実装にイベントを含めたことはないと思います。

関連する問題