@interface und @protocol Erklärung?

81

Ich möchte wissen, was die @ Schnittstelle in Ziel C ist? ist es nur dort, wo der Programmierer die Variablen, den Klassennamen oder die Methodennamen deklarieren möchte ...? Ich bin nicht sicher, ob es wie eine Schnittstelle in Java ist. Und über das @ -Protokoll in Ziel C auch. Es scheint wie die Schnittstelle in Java mehr. Könnte mir bitte jemand eine detaillierte Erklärung geben. Ich weiß das wirklich zu schätzen.

Rocker
quelle

Antworten:

91

In einer Schnittstelle definieren Sie die Attribute und Operationen der Klasse. Sie müssen auch die Implementierung festlegen.

Ein Protokoll ist wie eine Schnittstelle für Java.

z.B

@protocol Printing
    -(void) print;
@end

kann implementiert werden

durch Deklarieren (verwirrend in der Schnittstelle)

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

Das Verwirrende für Java-Entwickler ist, dass die geschweiften Klammern {}nicht das Ende der Benutzeroberfläche sind, z

@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
Johnno Nolan
quelle
10
Insgesamt eine ziemlich gute Erklärung, kommt aber als etwas voreingenommen heraus, dass Java es "besser" macht. Wie bei so vielen Dingen ist die Terminologie relativ zur Sprache. Es ist hilfreich, sich daran zu erinnern, dass Objective-C älter als Java ist und Java einiges daraus gezogen hat, einschließlich des Konzepts von Schnittstellen aus Protokollen. virtualschool.edu/objectivec/influenceOnJava.html Es wäre wohl weniger verwirrend gewesen, wenn Java den gleichen Namen beibehalten hätte, aber dies war nicht der Fall, da Java keine separate .h-Datei hat, die (in C / C ++) die " Schnittstelle "für eine Kompilierungseinheit.
Quinn Taylor
22
@QuinnTaylor Ich wollte nicht sagen, dass Java es besser macht, aber ich habe es so formuliert, als das OP die Frage in Bezug auf die Java-Sprache stellte.
Johnno Nolan
2
Was ist der Unterschied zwischen beiden, nur unter dem Gesichtspunkt von Ziel C? Beide scheinen zu erzwingen, dass bestimmte Methoden von den darauf basierenden Klassen implementiert werden. Ist der einzige Unterschied, dass Protokolle sozusagen klassenlos sind , während Schnittstellen implementiert werden müssen?
SexyBeast
Ich denke, der unehrliche Teil ist, dass das Protokoll keine abstrakte Klasse ist, sondern eher wie das COM-Dispinterface. Jedes Smalltalk-Objekt empfängt eine Nachricht nicht über .x oder .y wie in c ++ - Objekten (analog zu c myObject.lpVtbl->x(&myObject)), sondern über eine doppelte Schnittstelle, analog zu c myObject.lpVtbl->Invoke(&myObject, "x", &argArray);. Aus diesem Grund scheinen Protokolle und Schnittstellen dazu zu dienen, dem Compiler Informationen zur Generierung von Laufzeit- und Kompilierungszeit-Typüberprüfungen bereitzustellen. Daher gibt es in C ++ keine echte Parallele, es sei denn, Sie führen eine Skript-Engine / COM in Ihr Projekt ein.
Dmitry
28

wahrscheinlich gut , wenn man einen Blick auf nehmen dieses + Ich dachte , es war eine große Hilfe zu verstehen ,

Aus dem Artikel:

@Schnittstelle

C ++

Foo.h

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

Foo.cpp

#include "Foo.h"
...

Ziel c

Foo.h

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

Foo.m

#import "Foo.h"

@implementation Foo
...
@end

@Protokoll

C ++

struct MyInterface
{
  void foo() = 0;
}

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

Ziel c

@protocol MyInterface
-(void) foo;
@end

@interface Foo : NSObject <MyInterface>
{
 -(void) foo {...}
...
}
@end
AndersK
quelle
2
+1 Große Ressource. So ziemlich jeder C / C ++ - Programmierer, der in den Objective-C-Bereich eintritt.
KillAWatt1705
Das obige Beispiel @protocoldefiniert einige allgemeine Methoden, @interfacedefiniert einige benutzerdefinierte Methoden und @implementationimplementiert diese Schnittstelle. @interfacehat keine Implementierung. Auch wenn die fooMethode mit der des Protokolls identisch ist, sollte sie auf der Schnittstelle nicht wiederholt werden.
SMMousavi
Wow, ich wünschte ich hätte diesen Artikel früher gefunden. Sehr hilfreich von C ++ nach Obj. C, sehr, sehr empfehlen jedem anderen in dieser Position, sich die Zeit zu nehmen, um den in der Antwort verlinkten Artikel zu lesen.
user7804781
15

Das @interfacein Objective-C hat nichts mit Java-Schnittstellen zu tun. Es deklariert einfach eine öffentliche Schnittstelle einer Klasse, ihre öffentliche API. (Und Mitgliedsvariablen, wie Sie bereits beobachtet haben.) Java-Schnittstellen werden in Objective-C als Protokolle bezeichnet und mithilfe der @protocolDirektive deklariert . Sie sollten die Programmiersprache Objective-C von Apple lesen , es ist ein gutes Buch - kurz und sehr zugänglich.

Zoul
quelle