【问题标题】:@interface and @protocol explanation?@interface 和 @protocol 解释?
【发布时间】:2009-11-05 08:38:34
【问题描述】:

我想知道目标 C 中的@interface 是什么?它只是程序员想要声明变量、类名或方法名的地方吗……?我不确定它是否像 Java 中的接口。 还有关于目标 C 中的@protocol。看起来更像是Java中的接口。 谁能给我详细的解释。我真的很感激。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    接口是定义类的属性和操作的地方。你也必须制定实施。

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

    【讨论】:

    • 总的来说,很好的解释,但有点偏向于 Java 以“更好”的方式做到这一点。与许多事情一样,术语与语言有关。它有助于记住 Objective-C 早于 Java,Java 从中汲取了很多东西,包括协议中的接口概念。 virtualschool.edu/objectivec/influenceOnJava.html 如果 Java 保留相同的名称,可以说不会那么混乱,但他们没有,因为 Java 没有单独的 .h 文件(在 C/C++ 中)包含编译单元的“接口” .
    • @QuinnTaylor 我不想说“Java 做得更好”,但当 OP 提出与 Java 语言相关的问题时,我这样说。
    • 仅从Objective C的角度来看,两者有什么区别?两者似乎都强制要求某些方法由基于它们形成的类来实现。唯一的区别是协议可以说是classless,而接口需要实现吗?
    • 我认为不诚实的部分是协议不是抽象类,而是像 COM 调度接口。每个 smalltalk 对象不是像在 c++ 对象中那样通过 .x 或 .y 接收消息(类似于 c myObject.lpVtbl-&gt;x(&amp;myObject)),而是通过类似于 c myObject.lpVtbl-&gt;Invoke(&amp;myObject, "x", &amp;argArray); 的双接口接收消息。因此,协议和接口似乎可以为编译器提供信息以生成运行时和编译时类型检查。因此,除非您在项目中引入脚本引擎/COM,否则 C++ 中没有真正的并行。
    【解决方案2】:

    如果你看看 this 可能会很好 + 我认为这对理解很有帮助

    来自文章:

    @interface

    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
    

    【讨论】:

    • +1 很棒的资源。几乎每个 C/C++ 程序员进入 Objective-C 领域时的首选指南。
    • 关于上面的例子@protocol定义了一些通用方法,@interface定义了一些自定义方法,@implementation实现了该接口。 @interface 没有任何实现。另外如果foo的方法和protocol的方法一样,就不应该在接口上重复。
    • 哇,我希望我早点找到那篇文章。从 C++ 到 Obj 非常有帮助。 C,高度,强烈推荐该职位的其他人花时间查看答案中链接的文章
    【解决方案3】:

    Objective-C 中的@interface 与Java 接口无关。它只是声明了一个类的公共接口,即它的公共 API。 (以及成员变量,正如您已经观察到的那样。)Java 风格的接口在 Objective-C 中称为协议,并使用 @protocol 指令声明。您应该阅读 Apple 的 The Objective-C Programming Language,这是一本好书——简短且易于理解。

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多