@interface и @protocol объяснение?

82

Я хотел бы знать, что такое @interface в объекте C? это просто то место, где программист хочет объявить переменные, имя класса или имена методов ...? Я не уверен, что это похоже на интерфейс в Java. И про @protocol в объекте C. Вроде интерфейс на Яве больше нравится. Может ли кто-нибудь дать мне подробное объяснение, пожалуйста. Я действительно ценю это.

Рокер
источник

Ответы:

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 довольно много заимствовала из него, включая концепцию интерфейсов из протоколов. virtualschool.edu/objectivec/influenceOnJava.html Было бы, возможно, менее запутанно, если бы Java сохранила то же имя, но они этого не сделали, потому что Java не имеет отдельного файла .h, который (в C / C ++) содержит " интерфейс »для модуля компиляции.
Куинн Тейлор
22
@QuinnTaylor Я не хотел говорить «Java делает это лучше», но я сформулировал это так, поскольку OP задал вопрос относительно языка Java.
Johnno Nolan
2
Только с точки зрения Objective C, в чем разница между ними? Оба, похоже, требуют, чтобы определенные методы были реализованы классами, сформированными на их основе. Единственная разница в том, что протоколы так сказать бесклассовые , а интерфейсы нужно реализовывать?
SexyBeast
Я думаю, что нечестная часть состоит в том, что протокол - это не абстрактный класс, а скорее как диспетчерский интерфейс COM. Каждый объект smalltalk получает сообщение не через .x или .y, как в объектах c ++ (аналогично c myObject.lpVtbl->x(&myObject)), а через двойной интерфейс, аналогичный c myObject.lpVtbl->Invoke(&myObject, "x", &argArray);. Из-за этого протоколы и интерфейсы, кажется, служат для предоставления компилятору информации для генерации времени выполнения и проверки типов во время компиляции. Таким образом, в C ++ нет настоящей параллели, если вы не добавите в свой проект скриптовый движок / COM.
Дмитрий
28

наверное хорошо, если вы посмотрите на это + я подумал, что это здорово помогло понять

Из статьи:

@интерфейс

C ++

Foo.h

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

Foo.cpp

#include "Foo.h"
...

Цель-C

Foo.h

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

Foo.m

#import "Foo.h"

@implementation Foo
...
@end

@protocol

C ++

struct MyInterface
{
  void foo() = 0;
}

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

Цель-C

@protocol MyInterface
-(void) foo;
@end

@interface Foo : NSObject <MyInterface>
{
 -(void) foo {...}
...
}
@end
АндерсК
источник
2
+1 Отличный ресурс. Практически каждый программист на C / C ++ может обратиться к руководству при входе в сферу Objective-C.
KillAWatt1705
Пример выше @protocolопределяет некоторые общие методы, @interfaceопределяет некоторые специальные методы и @implementationреализует этот интерфейс. @interfaceне имеет никакой реализации. Также, если fooметод аналогичен методу протокола, поэтому его не следует повторять на интерфейсе.
SMMousavi
Вау, как бы мне хотелось найти эту статью раньше. Очень полезно перейти от C ++ к Obj. C, очень, очень рекомендую всем, кто занимает эту должность, потратить время на то, чтобы ознакомиться со статьей, на которую есть ссылка в ответе.
user7804781
15

@interfaceВ Objective-C не имеет ничего общего с Java интерфейсов. Он просто объявляет публичный интерфейс класса, его публичный API. (И переменные-члены, как вы уже заметили.) Интерфейсы в стиле Java называются протоколами в Objective-C и объявляются с помощью @protocolдирективы. Вам следует прочитать «Язык программирования Objective-C» от Apple, это хорошая книга - короткая и очень доступная.

зул
источник