「OnMyEvent」などのオーバーライド可能なメソッドを使用する必要があるとき、およびC#で「MyEvent」などのイベントを使用する必要があるときに、誰でも一般的なガイドラインを教えてくれますか?イベントとオーバーライド可能なメソッドの比較
何を使用するかを定義する一般的な設計原則はありますか?
「OnMyEvent」などのオーバーライド可能なメソッドを使用する必要があるとき、およびC#で「MyEvent」などのイベントを使用する必要があるときに、誰でも一般的なガイドラインを教えてくれますか?イベントとオーバーライド可能なメソッドの比較
何を使用するかを定義する一般的な設計原則はありますか?
イベントは、あなたが持っているときに最適ですオーバーライドはあなたが持っているような状況のために多くの優れている間、あなたは、基本クラスの動物を持っている場合、例えば関係
「である」、それを「持っています」各動物が独自の移動方法を持つことになりそうです。しかし、すべての動物は何らかの方法で移動したいと思っています。
ここで、ペット動物を「持っている」クラスの人を考えてみましょう。この場合、人は動く動物に反応するかもしれませんが、動いている動物を実際には扱いません。
2つの機能は曖昧に似ています(両方とも、ある形式の動的ディスパッチを行うように設計されています)が、直接比較することはできません。
イベントは、オブジェクトが何らかの種類のstate transitionになったことを他のオブジェクトに通知することです。これはthe Observer Design Patternを具体化する言語機能です。これは多くの場合に有用ですが、必ずしも有用であるとは限りません。特定の仕事を完了させるためのツールです。
仮想関数を使用してObject Oriented Polymorphismを作成します。ほとんどすべてのデザインパターンの基本的なビルディングブロックであり、多くのオブジェクト指向設計です。
これらを比較しようとすると、私はどちらかの機能を持つオブザーバーパターンのいくつかの形式を実装しようとしていると仮定します。その制限があるため、あなたはどちらを使うべきかを決めるための単純なルールはありません。は、あなたの状態遷移をトリガーするアクションは、内部で発生します、またはそれは、外部トリガされます。それを引き起こした
内部でトリガーされる場合は、イベントまたは仮想メソッドを使用できます。外部からトリガーされる場合は、仮想メソッドを使用する必要があります。それを気に
状態を所有するクラスがトランジションを処理する必要がある場合は、仮想メソッドである必要があります。別のクラスが遷移に反応する必要がある場合は、イベントでなければなりません。
必要な場合は、仮想メソッドまたはイベントのいずれかを使用できます。多くを必要とする場合は、イベントを使用する方がずっと簡単です。
ハンドラを変更する必要がある場合は、イベントを使用する必要があります。コンパイル時に既知のハンドラが1つしかない場合は、仮想メソッドを使用できます。私のコードがあるべき結合方法
派生クラスに属している場合は、仮想メソッドが必要です。他の場所に所属している場合は、イベントが必要です。
ご覧のとおり、回答は特定の問題のドメインとオブジェクトのアーキテクチャに大きく依存します。良いデザインは、いくつかのチェックリストを介して魔法のように膝に落ちるものではありません。あなたは、それについて考えることがたくさんある:)
編集:
それは、C#のイベントに直接適用ではないかもしれないが、既存の作品から例を取るために有用である可能性があります。ここでは、イベントパターンのためのJavaでの設計上の選択肢について、ちょうど私が見つけた(別の質問に答えながら)簡単な記事です:http://csis.pace.edu/~bergin/patterns/event.html
私はそれが理にかなっていると思う! –
この考えは私に興味をそそる。あなたの声明を続けると、例文で2つのフレーズを使用する答えを拡大できますか? – ckittel