@interface和@protocol解释?


80

我想知道目标C中的@interface是什么?程序员只是想在其中声明变量,类名还是方法名...?我不确定它是否类似于Java中的接口。还有目标C中的@protocol。似乎Java中的接口更多。谁能给我详细解释。我真的很感激。

Answers:


90

接口是定义类的属性和操作的地方。您还必须列出实现。

协议就像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
仅从目标C的角度来看,两者之间有什么区别?两者似乎都强制某些方法由基于它们的类来实现。唯一的区别是协议可以说是无类的,而接口需要实现吗?
SexyBeast

我认为最不诚实的部分是协议不是抽象类,而是像COM Dispinterface。每个smalltalk对象不是像c ++对象(类似于c myObject.lpVtbl->x(&myObject))那样通过.x或.y接收消息,而是通过类似于c的双重接口接收消息myObject.lpVtbl->Invoke(&myObject, "x", &argArray);。因此,协议和接口似乎可以为编译器提供生成运行时和编译时间类型检查的信息。因此,除非在项目中引入脚本引擎/ COM,否则C ++中没有真正的并行处理。
德米特里(Dmitry)'18

28

如果您看一下可能很好,+我认为这对理解很有帮助

从文章:

@接口

C ++

oo

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

Foo.cpp

#include "Foo.h"
...

目标C

oo

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

#import "Foo.h"

@implementation Foo
...
@end

@协议

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很棒的资源。进入Objective-C领域时,几乎每个C / C ++程序员都会使用该指南。
KillAWatt1705 2013年

关于上述示例@protocol定义了一些常规方法,@interface定义了一些自定义方法并@implementation实现了该接口。@interface没有任何实现。另外,如果foo方法与协议的方法相同,则不应在接口上重复该方法。
SMMousavi

哇,我希望我早点找到那篇文章。从C ++到Obj很有帮助。C,高度推荐,此位置的其他任何人都花时间检查答案中链接的文章
user7804781'1

15

@interface在Objective-C无关的Java接口。它只是声明一个类的公共接口,即其公共API。(和成员变量一样,您已经观察到了。)Java风格的接口在Objective-C中称为协议,并使用@protocol指令进行声明。您应该阅读Apple的《 Objective-C编程语言》,这是一本好书–简短易懂。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.