私は標準的なリスナーに精通しています。ジャワで。たとえば、オブジェクトのコレクションがある場合、CreateListener、ChangeListener、DeleteListener など、さまざまなものの一連のリスナーをサポートできます。それぞれに、影響を受けるオブジェクトのリストが渡されるメソッド (objectChange など) が 1 つあります。このコレクションを使用するアプリは、リスナーを実装して登録することにより、これらの 1 つ以上に関心を登録できます。コレクション内のオブジェクトに何かが起こると、適切なリスナーが呼び出されます。
しかし、これらのイベントの種類が多数あり、おそらく似ているが多少異なる場合はどうなるでしょうか。代わりに、多くのメソッドを持つ 1 つのリスナー クラスを定義することは理にかなっていますか。例えば:
class EventListener
{
void objectsCreatedA( Object[] newObjects );
void objectsCreatedB( Object[] newObjects );
void objectsCreatedC( Object[] newObjects );
void objectsChangedA( Object[] newObjects );
void objectsChangedB( Object[] newObjects );
void objectsChangedC( Object[] newObjects );
void objectsDeletedA( Object[] newObjects );
void objectsDeletedB( Object[] newObjects );
void objectsDeletedC( Object[] newObjects );
}
これにより、これらのイベントの多くに登録したいアプリにとって簡単になるようです。アプリは、それぞれが 1 つのメソッドのみを実装する多くのクラスを定義するのではなく、1 つのクラスに多くのメソッドを実装します。欠点や他の提案はありますか?
明確化の編集:(休日に気を取られて申し訳ありません。これが別の投稿であるべきかどうかはわかりませんが、これをフォローアップするのは理にかなっているようです)
クライアント アプリが使用するフレームワークとして、このコードが複数の言語で実装されることを指定する必要がありました。C++ の場合、複数のインターフェイスを実装するのは困難です。
スーパーセット抽象リスナーは、メソッドごとに何もしないデフォルトの実装を提供できるため、それを拡張するクライアントは、関心のあるものをオーバーライドするだけで済みます。このアプローチでは、後で追加のメソッドを抽象クラスに追加することを決定でき、既存のクライアントは問題ありません (必要に応じて、それらの新しいメソッドをオーバーライドできます)。また、(アプリが 1 つまたは複数を呼び出す) 多数の登録方法の代替ではなく、1 回の呼び出しで 1 つの登録のみが必要です。
この明確化により、スーパーセット抽象クラスは個々の抽象クラスよりも意味がありますか?