2011-07-31 12 views

答えて

6

イベントは、あなたが持っているときに最適ですオーバーライドはあなたが持っているような状況のために多くの優れている間、あなたは、基本クラスの動物を持っている場合、例えば関係

「である」、それを「持っています」各動物が独自の移動方法を持つことになりそうです。しかし、すべての動物は何らかの方法で移動したいと思っています。

ここで、ペット動物を「持っている」クラスの人を考えてみましょう。この場合、人は動く動物に反応するかもしれませんが、動いている動物を実際には扱いません。

+0

私はそれが理にかなっていると思う! –

+0

この考えは私に興味をそそる。あなたの声明を続けると、例文で2つのフレーズを使用する答えを拡大できますか? – ckittel

7

2つの機能は曖昧に似ています(両方とも、ある形式の動的ディスパッチを行うように設計されています)が、直接比較することはできません。

イベントは、オブジェクトが何らかの種類のstate transitionになったことを他のオブジェクトに通知することです。これはthe Observer Design Patternを具体化する言語機能です。これは多くの場合に有用ですが、必ずしも有用であるとは限りません。特定の仕事を完了させるためのツールです。

仮想関数を使用してObject Oriented Polymorphismを作成します。ほとんどすべてのデザインパターンの基本的なビルディングブロックであり、多くのオブジェクト指向設計です。

これらを比較しようとすると、私はどちらかの機能を持つオブザーバーパターンのいくつかの形式を実装しようとしていると仮定します。その制限があるため、あなたはどちらを使うべきかを決めるための単純なルールはありません。は、あなたの状態遷移をトリガーするアクションは、内部で発生します、またはそれは、外部トリガされます。それを引き起こした

  • :代わりに、あなた自身のような質問をする必要がありますか?

内部でトリガーされる場合は、イベントまたは仮想メソッドを使用できます。外部からトリガーされる場合は、仮想メソッドを使用する必要があります。それを気に

  • 万一の状態が状態遷移の結果を処理し、または外部クラスがそれを処理すべき定義するクラス?

状態を所有するクラスがトランジションを処理する必要がある場合は、仮想メソッドである必要があります。別のクラスが遷移に反応する必要がある場合は、イベントでなければなりません。

  • 私はどのように多くのハンドラ必要です:あなたは常に状態遷移に反応する1件のハンドラが必要ですか、あなたは多くを必要としますか?

必要な場合は、仮想メソッドまたはイベントのいずれかを使用できます。多くを必要とする場合は、イベントを使用する方がずっと簡単です。

  • は、私はコンパイル時に対象となるハンドラを知っていますか:私は、単一のよく知られたハンドラに特異的に結合するか、または私はおそらく時間の経過とともに変化する、未知のハンドラに結合していますか?

ハンドラを変更する必要がある場合は、イベントを使用する必要があります。コンパイル時に既知のハンドラが1つしかない場合は、仮想メソッドを使用できます。私のコードがあるべき結合方法

  • は、あなたのハンドラのコードは、あなたの元の型の派生クラスに属しないか、それがどこかに属しているのでしょうか?

派生クラスに属している場合は、仮想メソッドが必要です。他の場所に所属している場合は、イベントが必要です。

ご覧のとおり、回答は特定の問題のドメインとオブジェクトのアーキテクチャに大きく依存します。良いデザインは、いくつかのチェックリストを介して魔法のように膝に落ちるものではありません。あなたは、それについて考えることがたくさんある:)

編集:

それは、C#のイベントに直接適用ではないかもしれないが、既存の作品から例を取るために有用である可能性があります。ここでは、イベントパターンのためのJavaでの設計上の選択肢について、ちょうど私が見つけた(別の質問に答えながら)簡単な記事です:http://csis.pace.edu/~bergin/patterns/event.html

関連する問題