@interface和@protocol的解释?

85

我想知道 Objective-C 中的 @interface 是什么?它只是程序员想要声明变量、类名或方法名的地方吗?我不确定它是否像 Java 中的接口。

还有关于 Objective-C 中的 @protocol。它似乎更像 Java 中的接口。

请问有人能给我详细的解释吗?非常感谢。

3个回答

97

接口是用于定义类属性和操作的地方。你必须也要设置实现。

协议就像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

11
总体而言,解释得相当不错,但似乎有些偏袒Java采用了更“好”的方式。像很多事情一样,术语是相对于语言的。记住Objective-C比Java早,并且Java从中吸取了不少东西,包括从协议中概念上借鉴接口的概念。http://www.virtualschool.edu/objectivec/influenceOnJava.html 如果Java保留相同的名称可能会更清晰明了,但他们没有这样做,因为Java没有单独的.h文件来包含编译单元的“接口”(在C/C++中)的内容。 - Quinn Taylor
24
@QuinnTaylor,我本不想说“Java做得更好”,但因为提问者将问题与Java语言相关联,所以我用这种方式表达了。 - Johnno Nolan
2
仅从Objective C的角度来看,这两者有什么区别?它们似乎都强制要求基于它们形成的类实现某些方法。唯一的区别是协议是“无类”的,而接口需要被实现吗? - SexyBeast
我认为不诚实的部分在于协议不是抽象类,而更像COM dispinterface。每个Smalltalk对象都不是通过.x或.y接收消息(类似于C++对象中的c myObject.lpVtbl->x(&myObject)),而是通过双重接口接收消息,类似于C myObject.lpVtbl->Invoke(&myObject, "x", &argArray);。因此,协议和接口似乎用于向编译器提供信息以生成运行时和编译时类型检查。因此,除非您将脚本引擎/COM引入项目中,否则在C ++中没有真正的并行。 - Dmytro

31

如果您查看这个,应该会很有帮助。我认为它非常有助于理解。

从文章中:

@interface

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

@protocol

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
非常好的资源。几乎每个C/C++程序员进入Objective-C领域时都会使用的指南。 - KillAWatt1705
关于上面的例子,@protocol 定义了一些通用方法,@interface 定义了一些自定义方法,而 @implementation 则实现了该接口。@interface 没有任何实现。此外,如果 foo 方法与协议中的方法相同,则不应在接口中重复定义。 - S.M.Mousavi
哇,我希望更早发现那篇文章。对于从 C++ 到 Obj. C 的转换非常有帮助,强烈推荐处于同一位置的任何人花时间去查看答案中链接的文章 - user7804781

16

@interface在Objective-C中与Java接口无关。它仅声明一个类的公共接口,即其公共API。(以及成员变量,正如您已经观察到的那样。) Java风格的接口在Objective-C中被称为协议,并使用@protocol指令声明。建议阅读由苹果公司编写的《Objective-C编程语言》,这是一本很好的书籍-简短且非常易懂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接