2011-10-01 6 views
15

私は本当にひどく私を混乱させる宿題の質問があります。以下は質問の簡単な説明です。目的Cプロトコルの使用

コンタクト の情報を格納するアプリケーションを開発しているとします。アドレス帳は、多くのエンティティタイプを含むことができる。人間 は、連絡先情報を持っている会社または他のものです。今

  • 代わりに、明示的にすべてのオブジェクトタイプは、オブジェクトが動作する必要がありますし、正常 があなたのアドレス帳に表示されるかを宣言する プロトコルを書きチェックします。

私の理解と、この質問をされて答えるの努力、

  1. @requiredタグの下の連絡先情報の各タイプの一般的な方法を持っているプロトコルを構築します。そして、別の連絡先で似ていない他のすべての方法(ファックス番号は会社との関連がありますが、人とは関係ありません...)は@オプションの下にあります。実行時に、selectorを使用して、オブジェクトが任意のメソッドに応答するかどうかを確認できます。 疑問:しかし、間接的にオブジェクトタイプを明示的にチェックしていますが、そうですか?

  2. 私の2番目の考えは、javaにabstract classのようなものを使用することです。つまり、継承されたクラスは、抽象クラスから独自の抽象メソッドを実装します。どのようにナイーブなiOS開発者として私はこれを実装する方法を知らないのですか?これが私の問題を解決するかどうかはわかりません。誰かがこれを知っていれば私は悟りを得たいと思います。


外部読書がこれまで行って、私が探しています答えはこれらのリンクのいずれかである場合は私に知らせてください。私はこれを理解し解決するためにもう一度それを読むでしょう:)。ありがとう。

  1. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF144

  2. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF146

  3. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF149

+5

宿題を尋ねる優れた方法。 +1のための+1 http://catb.org/esr/faqs/smart-questions.html – 0x8badf00d

+0

このリンクはプロトコルの概念を明確に説明しています。http://www.tutorialspios.com/ios/ios_delegates.htm –

答えて

10

プロトコルは、Javaインターフェースと同じものです。クラスがサポートすべきメソッドを定義するだけです。その後、

@protocol ContactProtocol 
-(void) phoneNumber; 
@end 

@interface Person: NSObject <ContactProtocol> { 
    ... 
} 

@interface Company: NSObject <ContactProtocol> { 
    ... 
} 

そして:あなたはクラスを使用すると、このような何かをするだろうphoneNumber方法(phoneNumberプロパティへのアクセサを)持っているだろうことを確認したい場合はhttp://www.otierney.net/objective-c.html#protocols

基本的に:ここでは明確にそれを説明するページがありますコンパイル時(またはxcode 4の場合)には、phoneNumberメソッドをPersonまたはCompanyクラスに追加するのを忘れたかどうかを教えてくれます。

+6

プロトコルは次のようには異なります抽象クラス;代わりにJavaのインタフェースに似ています。抽象クラスからクラスを派生させると、そのメソッドとその実装の両方を継承します。インターフェイスを使用すると、宣言だけが得られます。 Obj-cプロトコルでも同じことが言えます。クラスがプロトコルを実装することを宣言するときは、メソッドの実装を提供する必要があります。 – Caleb

+0

あなたは絶対に正しいです。私はインターフェイスを考えていた!私は私の答えを更新しています。 –

+0

Otierney.netへのリンクは現在停止しています。ここには、キャッシュされたGoogleのリンクがありますが、どれくらい時間がかかるかはわかりません。http://webcache.googleusercontent.com/search?q=cache:QbGm74kZa1wJ:www.otierney.net/objective-c.html+&cd=1&hl=en&ct=clnk&gl=us – kevins

4

しかし、これは間接的にオブジェクトの種類を明示的にチェックしています。

いいえ、チェックの動作はタイプのチェックと異なります。任意のオブジェクトに-respondsToSelector:を送信できます。結果がYESの場合は、オブジェクトのタイプに関係なくメッセージを送信できます。また、オブジェクトが再びその実際の型を気にすることなく、与えられたプロトコルを実装することを要求することができます

id<SomeProtocol> foo; // foo points to any type that implements SomeProtocol 

私の第二の考えは、Javaの抽象クラスのようなものを使用することです。

これはうまくいくかもしれませんが、あなたの割り当てが求めていたのは明らかです。 "...プロトコルを書く..."と書いてあります。

Objective-Cは、Javaのやり方を明示的にクラス抽象化する方法を提供していません。クラスを作成するだけです。直接インスタンス化する必要がない場合は、その場所を文書化してください。

+0

この質問はSwiftについてではなく、if私が間違っていると私を修正してください。最初の答えは次のようになります:はい、今スイフトではプロトコルがタイプであり、単に 'delegate?.someMethod'を実行すると' respondsToSelector'と同じではありませんデリゲートが設定されている場合の機能...第2の質問:(抽象クラ​​スと同じように)プロトコルにデフォルトの実装を提供することができるのでSwiftの(受け入れられた回答のコメントを読んだ後)。 – Honey

+1

@Honeyこの回答はSwiftに先立ち、この文脈で読むべきです。同じことが私のコメントになります。質問と回答がSwiftと同時にあったとしても、質問のタイトル*は「Objective-C」と表示され、質問には[tag:objective-c]というタグが付けられています。 – Caleb

+0

私は本当にそれを知っている、私はちょうどそれがスウィフトとの相違について尋ねていた、この件名で回答があり、私はすべてを一緒に(特に上のあなたのコメントに沿って)一緒に置くことができたかどうかをチェックしていた。 – Honey

1

あなたにはオプションがあります。

任意のメソッドは、クラスを書く人がプロトコルに準拠するのに便利で、プロトコルを使用する人には迷惑です。だから、それはあなたが誰を喜んでいるかによって異なります。

オプションのメソッドは、型のチェックほど悪くありません。接触可能なエンティティオブジェクトにアクセスするときのコードの外観を想像してみてください。オプションのメソッドを使用する場合は、ifの場合とelseの場合が必要です。メソッドを呼び出すことができると仮定して、先に進むだけでは便利ではありません。しかし、それはタイプをチェックするよりも便利です。それは、異なるタイプのエンティティの場合(そして、アサーションかもしれない他の場合)の1つになります。さらに、オプションのメソッドを使用すると、エンティティに関する情報がそのクラスにカプセル化されます。メソッドを呼び出す前にタイプをチェックすると、エンティティが提供する連絡先情報のタイプに関する情報が、呼び出しコードのクラス外にあります。追加の連絡先タイプを提供するようにエンティティーをアップグレードする場合、その改善は呼び出しコードを更新するまで利用できません。

オプションBは、必要なすべてのメソッドを作成しますが、情報がないことを示す値(nilなど)を返すオプションを与えます。もちろん、それはまだ無限の結果をチェックするifの場合を意味しますが、あまり冗長ではありません。この問題のさらに良い解決策は、メソッドが複数の連絡先のコレクションを返すようにすることです。結局のところ、人々は複数の電話番号を持つことができます。連絡先の種類が該当しないことを示すには、空のコレクションを返すだけです。

プロトコルに準拠したクラスを書く人は誰でも、return nilなどの簡単なスタブメソッドを追加する必要があります。

関連する問題