JavaインターフェースとObjective-Cプロトコルの違いは?

Arne Evertsson:

私はJavaを知っており、現在Objective-Cを学んでいます。JavaインターフェースとObjective-Cプロトコルの違いは何ですか?

クイン・テイラー:

まず、Javaの作成者の1人による、トピックに関する少し歴史的な視点次に、ウィキペディアには、Objective-Cプロトコルに関するやや役立つセクションがあります特に、Objective-Cは、正式なプロトコル@protocolキーワードで明示的に宣言される、Javaインターフェイスに相当)と非公式のプロトコル(リフレクションを介して検出できるクラスによって実装される1つ以上のメソッドのみ)の両方をサポートすることを理解してください。

正式なプロトコル(「インターフェースの実装」を表すObjective-Cの用語)を採用すると、Javaで期待するように、コンパイラーは実装されていないメソッドに対して警告を発します。 Javaとは異なり(スキャフマンが述べたように)、Objective-Cクラスが正式なプロトコルに含まれるメソッドを実装する場合、そのインターフェースが明示的に採用していなくても、そのプロトコルに「準拠」していると言います。次のように、(- conformsToProtocol:を使用して)コードでプロトコルの適合性をテストできます

if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
    ...
}

注:Appleのドキュメントには次のように記載されています。

「このメソッドは、上に示したように、ヘッダーファイルの正式な宣言のみに基づいて適合性を決定します。プロトコルで宣言されたメソッドが実際に実装されているかどうかを確認するのではなく、プログラマーの責任です。」

Objective-C 2.0(OS X 10.5 "Leopard"およびiOS)では、正式なプロトコルでオプションのメソッドを定義できるようになり、クラスは必要なすべてのメソッドを実装している限り、プロトコルに準拠しています。あなたは使用することができます@required(デフォルト)と@optionalフォローをすることをメソッド宣言するかどうかをトグルにキーワードをしなければならないプロトコルに準拠するように実装されます。オプションのプロトコルメソッドについて説明しているAppleのObjective-C 2.0プログラミング言語ガイドのセクションを参照してください。)

オプションのプロトコルメソッドは、特にデリゲートリスナーの実装において、開発者に多くの柔軟性をもたらしますMouseInputAdapter(Javaも単一継承なので煩わしい場合があります)のようなものを拡張したり、無意味な空のメソッドを多数実装したりする代わりに、プロトコルを採用して、必要なオプションのメソッドのみを実装できます。このパターンを使用すると、呼び出し元は、(- respondsToSelectorを使用してメソッドを呼び出す前に、次のようにメソッドが実装されているかどうかを確認します

if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
    [myObject fillArray:anArray withObject:foo];
    ...
}

リフレクションのオーバーヘッドが問題になる場合は、ブール値の結果をキャッシュして再利用できますが、時期尚早に最適化したいという衝動には抵抗できます:-)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++コンセプトとJavaインターフェースの違いは何ですか?

分類Dev

Objective-Cの抽象クラスとインターフェースの違い

分類Dev

C ++のコンセプトとインターフェイスの違いは何ですか?

分類Dev

Objective-Cと同等のインターフェースタイプ?

分類Dev

Objective-Cと同等のインターフェースタイプ?

分類Dev

Javaのインターフェースと@インターフェースの違いは何ですか?

分類Dev

プロトコルとデリゲートの違いは?

分類Dev

JavaのRunnableインターフェースとCallableインターフェースの違い

分類Dev

Java:SetインターフェースとCollectionインターフェースの違い

分類Dev

C ++のプロトタイプデザインパターンとコピーコンストラクターの違いは何ですか

分類Dev

SFTPプロトコルとSCPプロトコルのスループットの違いは何ですか

分類Dev

C ++とJavaのコンパイルプロセスの違い

分類Dev

C#とJavaのインターフェース実装の違い

分類Dev

GoとJavaのインターフェースの違いは何ですか?

分類Dev

Objective-C / XCodeで、コマンドラインツールプロジェクト内のプロトコルを定義するカスタムCocoaフレームワークを使用するにはどうすればよいですか?

分類Dev

コントローラとルーターの違いは?

分類Dev

Objective-CマルチインターフェースiOS

分類Dev

Javaクラスとインターフェースの実装

分類Dev

SwiftのプロトコルとJavaのインターフェイスを比較する

分類Dev

Javaのインターフェースとは何ですか?

分類Dev

pgpプロトコルとrsaプロトコルの違い

分類Dev

Javaのインターフェースは何とインターフェースしますか?

分類Dev

rtmpとrtspプロトコルの違いは何ですか?

分類Dev

プロトコルとAPIの違いは何ですか?

分類Dev

LaravelのコントラクトとPHPのインターフェースの違いは何ですか?

分類Dev

Javaの型としてのインターフェース?

分類Dev

Javaインターフェイスとパラメータタイプ

分類Dev

プロトコルとJsonワイヤープロトコルの違いは何ですか

分類Dev

Javaインターフェイス-通常のインターフェイスの定数と静的クラス

Related 関連記事

  1. 1

    C ++コンセプトとJavaインターフェースの違いは何ですか?

  2. 2

    Objective-Cの抽象クラスとインターフェースの違い

  3. 3

    C ++のコンセプトとインターフェイスの違いは何ですか?

  4. 4

    Objective-Cと同等のインターフェースタイプ?

  5. 5

    Objective-Cと同等のインターフェースタイプ?

  6. 6

    Javaのインターフェースと@インターフェースの違いは何ですか?

  7. 7

    プロトコルとデリゲートの違いは?

  8. 8

    JavaのRunnableインターフェースとCallableインターフェースの違い

  9. 9

    Java:SetインターフェースとCollectionインターフェースの違い

  10. 10

    C ++のプロトタイプデザインパターンとコピーコンストラクターの違いは何ですか

  11. 11

    SFTPプロトコルとSCPプロトコルのスループットの違いは何ですか

  12. 12

    C ++とJavaのコンパイルプロセスの違い

  13. 13

    C#とJavaのインターフェース実装の違い

  14. 14

    GoとJavaのインターフェースの違いは何ですか?

  15. 15

    Objective-C / XCodeで、コマンドラインツールプロジェクト内のプロトコルを定義するカスタムCocoaフレームワークを使用するにはどうすればよいですか?

  16. 16

    コントローラとルーターの違いは?

  17. 17

    Objective-CマルチインターフェースiOS

  18. 18

    Javaクラスとインターフェースの実装

  19. 19

    SwiftのプロトコルとJavaのインターフェイスを比較する

  20. 20

    Javaのインターフェースとは何ですか?

  21. 21

    pgpプロトコルとrsaプロトコルの違い

  22. 22

    Javaのインターフェースは何とインターフェースしますか?

  23. 23

    rtmpとrtspプロトコルの違いは何ですか?

  24. 24

    プロトコルとAPIの違いは何ですか?

  25. 25

    LaravelのコントラクトとPHPのインターフェースの違いは何ですか?

  26. 26

    Javaの型としてのインターフェース?

  27. 27

    Javaインターフェイスとパラメータタイプ

  28. 28

    プロトコルとJsonワイヤープロトコルの違いは何ですか

  29. 29

    Javaインターフェイス-通常のインターフェイスの定数と静的クラス

ホットタグ

アーカイブ