@interface i @protocol wyjaśnienie?

82

Chciałbym wiedzieć, czym jest @interface w celu C? czy to tylko miejsce, w którym programista chce zadeklarować zmienne, nazwę klasy lub nazwy metod ...? Nie jestem pewien, czy jest podobny do interfejsu w Javie. A także o protokole @ w celu C. Wygląda na to, że interfejs w Javie bardziej. Czy ktoś mógłby mi podać szczegółowe wyjaśnienie. Naprawdę to doceniam.

Biegun
źródło

Odpowiedzi:

92

Interfejs to miejsce, w którym definiujesz atrybuty i operacje klasy. Musisz także przygotować implementację.

Protokół jest jak interfejs dla java.

na przykład

@protocol Printing
    -(void) print;
@end

można zaimplementować

deklarując (myląco w interfejsie)

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

Mylące dla programistów java jest to, że nawiasy klamrowe {}nie są końcem interfejsu, np

@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
źródło
10
Ogólnie dość dobre wyjaśnienie, ale wydaje się nieco stronnicze, że Java robi to w „lepszy” sposób. Jak w przypadku wielu innych rzeczy, terminologia odnosi się do języka. Warto pamiętać, że Objective-C poprzedza Javę, a Java sporo z niego czerpała, włączając w to koncepcję interfejsów z protokołów. virtualschool.edu/objectivec/influenceOnJava.html Zapewne byłoby mniej zagmatwane, gdyby Java zachowała tę samą nazwę, ale tak się nie stało, ponieważ Java nie ma oddzielnego pliku .h, który (w C / C ++) zawiera „ interfejs ”dla jednostki kompilacji.
Quinn Taylor
22
@QuinnTaylor Nie chciałem mówić „Java robi to lepiej”, ale sformułowałem to w ten sposób, ponieważ OP zadał pytanie w odniesieniu do języka Java.
Johnno Nolan
2
Tylko z punktu widzenia celu C, jaka jest różnica między nimi? Oba wydają się wymuszać, że określone metody są implementowane przez klasy, które są tworzone na ich podstawie. Czy jedyną różnicą jest to, że protokoły są, że tak powiem, bezklasowe , podczas gdy interfejsy wymagają implementacji?
SexyBeast
Myślę, że nieuczciwe jest to, że protokół nie jest klasą abstrakcyjną, ale raczej przypomina interfejs COM. Każdy obiekt smalltalk otrzymuje wiadomość nie przez .x lub .y, jak w obiektach c ++ (analogicznie do c myObject.lpVtbl->x(&myObject)), ale przez podwójny interfejs, analogiczny do c myObject.lpVtbl->Invoke(&myObject, "x", &argArray);. Z tego powodu protokoły i interfejsy wydają się służyć do dostarczania kompilatorowi informacji do generowania sprawdzania typów w czasie wykonywania i kompilacji. Więc nie ma prawdziwej analogii w C ++, chyba że wprowadzisz silnik skryptowy / COM do swojego projektu.
Dmitry
28

prawdopodobnie dobrze, jeśli spojrzysz na to + Pomyślałem, że bardzo pomogło to zrozumieć

Z artykułu:

@berło

C ++

Foo.h

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

Foo.cpp

#include "Foo.h"
...

Cel C

Foo.h

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

Foo.m

#import "Foo.h"

@implementation Foo
...
@end

@protokół

C ++

struct MyInterface
{
  void foo() = 0;
}

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

Cel C

@protocol MyInterface
-(void) foo;
@end

@interface Foo : NSObject <MyInterface>
{
 -(void) foo {...}
...
}
@end
AndersK
źródło
2
+1 Świetny zasób. Prawie każdy przewodnik programisty C / C ++ podczas wchodzenia do dziedziny Objective-C.
KillAWatt1705
Informacje o powyższym przykładzie @protocoldefiniuje kilka ogólnych metod, @interfacedefiniuje niestandardowe metody i @implementationimplementuje ten interfejs. @interfacenie ma żadnej implementacji. Również jeśli foometoda jest taka sama jak metoda protokołu, więc nie należy jej powtarzać na interfejsie.
SMMousavi
Wow, żałuję, że nie znalazłem tego artykułu wcześniej. Bardzo pomocne przejście z C ++ do Obj. C, bardzo, gorąco polecam każdemu na tym stanowisku, aby poświęcił czas na przeczytanie artykułu, do którego link znajduje się w odpowiedzi.
user7804781
15

W @interfaceObjective-C nie ma nic wspólnego z interfejsami Java. Po prostu deklaruje publiczny interfejs klasy, jej publiczny interfejs API. (Oraz zmienne składowe, jak już zauważyłeś). Interfejsy w stylu Java nazywane są protokołami w Objective-C i są deklarowane przy użyciu @protocoldyrektywy. Powinieneś przeczytać The Objective-C Programming Language firmy Apple, to dobra książka - krótka i bardzo przystępna.

zoul
źródło