EDITED:Alridさんのコメント@付き
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
したがって、サブスクライバーはオブザーバーの実装であり、サブスクリプションに追加のセマンティクスがあります(サブスクリプション解除に関するものです)。質問のコードObserver
は、実装(通常のプログラミング手法)ではなく、インターフェイスを通過することを示しています。
また、このコードはを返します。これは、このコードの作成Subscription
者が、クライアントはSubscription
メソッドにのみアクセスでき、observableによって生成された要素にはアクセスできないと考えたためである可能性があります。それはプログラマーのエラーかもしれません。
長い話
本当にこのウェブサイト(または本)の内容を読む必要があります:http://www.introtorx.com
Rx.Netについてですが、概念はまったく同じで、Erik Meijerによって作成され、RxJavaの実装者がそれに続きました( Java言語に該当する場合)。
このページはあなたの興味を引くでしょう(それは第2章です):KeyTypes
ここでは、最初の段落で読みます:
Rxを使用するときに理解する2つの主要なタイプと、Rxをより効果的に学習するのに役立つ補助タイプのサブセットがあります。IObserverとIObservableは、Rxの基本的な構成要素を形成しますが、ISubjectの実装は、Rxを初めて使用する開発者の学習曲線を短縮します。
..。
基本的に、RxはObserverパターンの基盤の上に構築されています。.NETは、マルチキャストデリゲートやイベント(通常はマルチキャストデリゲート)など、オブザーバーパターンを実装する他のいくつかの方法をすでに公開しています。
タイプ/ APIが少し異なっていても、この本で多くのことを学ぶことができます。おそらく、いくつかのブログよりもはるかに多くのことを学ぶことができます。
この本が言っていないこと(... RxJava実装にあるため)
この時点でRxJavaのメイン開発者は、2つのタイプのコントラクトを区別できるようにするわずかなバリエーション(PR #792を参照)を導入しました。
- 通知->
Observer
- (非)サブスクリプション->
Subscription
この変更により、RxJavaライブラリの実装クラスに関するこれらの懸念をより適切に表現/分割することができました。
ただし、ライブラリユーザーとしては、RxJavaライブラリの実際の実装を使用するだけで十分です。
サブスクライバーの実装には、はるかに多くの知識、作業、および注意が必要です。実際、サブスクリプションのセマンティクスは、監視可能なソースのタイプ(ホットまたはコールド?作成に費用がかかる?)に応じて非常に重要です。
上記のような場合Subscriber
ではなく公開Observer
しても、ほとんどの場合コードに干渉しませんが、サブスクリプション解除のセマンティクスが必要でない限り、コードの使用目的ではありません。しかし、最終的にはSubscriber
、を実装し、次のようないくつかの落とし穴に陥る可能性があります。
- 使用しない機能にリソースを費やす
- 別のクラスから継承することはできません
- 間違ったサブスクリプション解除コードを書く
- 間違ったコードまたは別のコンテキスト用に記述された正しいコードをコピーして貼り付ける