2009-03-20 13 views
5

私は、このような後半のよう次のように多くのコードを参照してください。Objective-Cのインスタンス変数上のプロトコルはどのように機能しますか?

id<foo> aBar; 

一般的に、これは以下のような、私はクラス宣言で参照してくださいねものです:

@interface bar : UIViewController <UITableViewDelegate, UITableViewDataSource> 

上記の平均をいaBarはクラス・バーのインスタンスであり、fooプロトコルで宣言されたすべてのメソッドを持つことを約束しますか?

答えて

16

閉じる。 aBarは、プロトコルfooに準拠するクラスのインスタンスになります。 bar(そのクラスがfooに準拠している場合)またはfooに準拠する別のクラスにすることができます。その宣言から知っていることは、aBarがプロトコルに準拠していることだけです。

また、これらは実行時ではなくコンパイル時にのみチェックされます。 fooに準拠するクラスのインスタンスではないオブジェクトをaBarに配置することは可能です。しかし、コンパイラはほとんどの場合、それについて警告します。

+0

質問と回答に「foo」と「bar」が入れ替わっている可能性があります。彼のクラス 'bar'はfooプロトコルを採用していないので、コンパイラは 'bar'のインスタンスを 'aBar'に格納することについて文句を言うでしょう。 –

+0

私はスワップはないと思っていますが、fooプロトコルに準拠していないバークラスについては正しいです。私は彼の最後の段落がなぜ彼がそれをそのように書いたのかを説明すると思います。 –

0

正確に。プロトコルとは、クラスを継承せず、そのクラスのメソッドプロトタイプを取得することを意味します。この方法では、それらのメソッドを必要とするオブジェクトと対話しようとしているときに、そのメソッドのスタブが何であるかを知ることができます。 C#の浅いインターフェースを考えてみましょう。

私はC#が私の主要言語だからだと言います。 :)

関連する問題