Пояснення @interface та @protocol?


82

Я хотів би знати, що таке @interface в об'єкті C? це просто де програміст хоче оголосити змінні, ім'я класу або імена методів ...? Я не впевнений, чи це схоже на інтерфейс у Java. І про @protocol у об'єктиві C також. Здається, інтерфейсу в 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 досить багато витягнула з неї, включаючи концепцію інтерфейсів з протоколів. virtualschool.edu/objectivec/influenceOnJava.html Це, можливо, було б менш заплутаним, якби Java зберегла те саме ім'я, але цього не було, оскільки Java не має окремого файлу .h, який (на C / C ++) містить " інтерфейс "для блоку компіляції.
Quinn Taylor

22
@QuinnTaylor Я не хотів говорити "Java робить це краще", але я сформулював це так, коли OP задав питання стосовно мови Java.
Джонно Нолан

2
У чому полягає лише різниця між ціллю З? Здається, обидва вимагають, щоб певні методи реалізовувались класами, що формуються на їх основі. Єдина відмінність полягає в тому, що протоколи, так би мовити, безкласові , тоді як інтерфейси потребують реалізації?
SexyBeast

Я думаю, що нечесною частиною є те, що протокол не є абстрактним класом, а швидше схожий на COM dispinterface. Кожен об'єкт 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, це гарна книга - коротка і дуже доступна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.