@interfaceと@protocolの説明?


82

Objective Cの@interfaceが何であるか知りたいですか?プログラマーが変数、クラス名、またはメソッド名を宣言したい場所ですか...?それがJavaのインターフェースのようなものかどうかはわかりません。そして、ObjectiveCの@protocolについても同様です。Javaのインターフェースのようです。誰か詳細な説明をお願いします。本当に感謝しています。

回答:


92

インターフェイスは、クラスの属性と操作を定義する場所です。実装も設定する必要があります。

プロトコルは、Javaのインターフェースのようなものです。

例えば

@protocol Printing
    -(void) print;
@end

実装可能

宣言することによって(インターフェースで混乱して)

@interface Fraction: NSObject <Printing, NSCopying> {
//etc..

Java開発者にとって紛らわしいのは、中括弧{}がインターフェースの終わりではないということです。

@interface Forwarder : Object
{
    id recipient; 
} //This is not the end of the interface - just the operations


- (id) recipient;
- (id) setRecipient:(id) _recipient; 
//these are attributes.

@end
//This is the end of the interface

10
全体として、かなり良い説明ですが、Javaがそれを「より良い」方法で行うという偏見があるためです。多くのものと同様に、用語は言語に関連しています。Objective-CはJavaよりも前のものであり、Javaはプロトコルからのインターフェースの概念を含め、Javaからかなりの部分を引き出したことを覚えておくと役立ちます。virtualschool.edu/objectivec/influenceOnJava.html Javaが同じ名前を保持していれば、間違いなく混乱は少なくなりますが、Javaには(C / C ++で)「コンパイルユニットの「インターフェイス」。
クインテイラー

22
@QuinnTaylor「Javaの方が優れている」とは言いたくありませんでしたが、OPがJava言語に関連して質問したので、そのように表現しました。
Johnno Nolan

2
Objective Cのみの観点から、2つの違いは何ですか?どちらも、特定のメソッドがそれらに基づいて形成されたクラスによって実装されることを強制しているようです。唯一の違いは、プロトコルはいわばクラスレスであり、インターフェイスを実装する必要があるということですか?
SexyBeast 2014年

不誠実な部分は、プロトコルが抽象クラスではなく、COMdispinterfaceのようなものだと思います。すべてのsmalltalkオブジェクトは、c ++オブジェクト(cに類似myObject.lpVtbl->x(&myObject))のように.xまたは.yを介してではなく、cに類似したデュアルインターフェイスを介してメッセージを受信しますmyObject.lpVtbl->Invoke(&myObject, "x", &argArray);。このため、プロトコルとインターフェイスは、ランタイムとコンパイル時のタイプチェックを生成するための情報をコンパイラに提供するのに役立つようです。したがって、スクリプトエンジン/ COMをプロジェクトに導入しない限り、C ++には真の類似点はありません。
ドミトリー

28

これを見ていただければ多分良いです+理解するのに大いに役立ったと思いました

記事から:

@インターフェース

C ++

Foo.h

#ifndef __FOO_H__
#define __FOO_H__
class Foo
{
...
};

Foo.cpp

#include "Foo.h"
...

Objective-C

Foo.h

@interface Foo : NSObject
{
...
}
@end

Foo.m

#import "Foo.h"

@implementation Foo
...
@end

@プロトコル

C ++

struct MyInterface
{
  void foo() = 0;
}

class A : MyInterface
{
public:
  void override foo() { ... }
}

Objective-C

@protocol MyInterface
-(void) foo;
@end

@interface Foo : NSObject <MyInterface>
{
 -(void) foo {...}
...
}
@end

2
+1素晴らしいリソース。Objective-Cの領域に足を踏み入れるとき、ほとんどすべてのC / C ++プログラマーの頼りになるガイド。
killAWatt1705 2013

上記の例について@protocol、いくつかの一般的な方法を定義します。@interface定義し、いくつかのカスタムメソッドを定義し@implementationそのインターフェイスを実装します。@interface実装はありません。また、fooメソッドがプロトコルのものと同じである場合は、インターフェイスで繰り返さないでください。
SMMousavi 2016年

うわー、私はその記事をもっと早く見つけていたらよかったのに。C ++からObjに移行するのに非常に役立ちます。C、非常に、その立場にある他の誰かが答えにリンクさている記事チェックするために時間を費やすことを強くお勧めします。
user78047 8119年

15

@interfaceObjective-Cの中には、Javaインターフェースとは何の関係もありません。クラスのパブリックインターフェイス、そのパブリックAPIを宣言するだけです。(そして、すでに観察したように、メンバー変数。)JavaスタイルのインターフェースはObjective-Cではプロトコルと呼ばれ、@protocolディレクティブを使用して宣言されます。AppleのObjective-Cプログラミング言語を読む必要がありますこれは良い本です–短くて非常にアクセスしやすいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.