LoginSignup
4
3

More than 3 years have passed since last update.

【Unity】AsObservable()メソッドについて【UniRx】

Last updated at Posted at 2019-05-16

はじめに

UniRxを用いた開発を行っている時に、subject.AsObservable()という形で目にすることが多いAsObservable()メソッドの意味を調べてみました。

環境

Unity 2019 1.1f1
UniRx 6.2.2

結論

いくつかのインターフェースを実装しているsubjectIObservableにアップキャストして、IObservable以外のインターフェースが持っている処理(OnNextなど)を禁止するためです。

実例

Subject<int> subject = new Subject<int>();

//IObservable<int>にアップキャスト
IObservable<int> stream = subject.AsObservable();

stream.Subscribe(l => Debug.Log(l));

stream.OnNext(1); //エラーになる

subject.OnNext(1); //エラーにならない

理由

まずSubject<T>

public sealed class Subject<T> : ISubject<T>, IDisposable, IOptimizedObservable<T> { ... }

のように、ISubject<T>を実装しています。
そしてこのISubject<T>は、

public interface ISubject<T> : ISubject<T, T>, IObserver<T>, IObservable<T> { ... }

のようにIObserver<T>インターフェースとIObservable<T>インターフェースを継承しています。
つまり、Subject<T>クラスはIObserver<T>インターフェースとIObservable<T>インターフェースを実装しています。
また、AsObservable()メソッドは、

public static IObservable<TSource> AsObservable<TSource>(
    this IObservable<TSource> source
)

のようにIObservableインターフェースの拡張メソッドとして定義されていて、subjectから流れてくる値をIObservable型にキャストして返す役割を持ちます。
IObservable型にキャストされると、IObservable以外のインターフェースの持つメソッド(OnNext()OnError()など)が使えなくなります。

まとめ

  • IObservableインターフェースを実装しているSubject型のインスタンスは、IObservableの拡張メソッドであるAsObservable()メソッドを使うことができる。
  • AsObservable()メソッドはsubjectから流れてきた値をIObservable型にキャストして返す処理を行う。

  • AsObservable()メソッドを使うことによって、元々IObservable以外のインターフェースのメソッドを使うこともできた(Subject型のインスタンスである)subjectに、IObservable以外のインターフェースのメソッドの使用を禁止させることができる。

参考

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3