@interface 및 @protocol 설명?


82

Objective C의 @interface가 무엇인지 알고 싶습니다. 프로그래머가 변수, 클래스 이름 또는 메서드 이름을 선언하려는 곳입니까? Java의 인터페이스와 같은지 확실하지 않습니다. 객관적인 C의 @ 프로토콜에 대해서도 마찬가지입니다. Java의 인터페이스처럼 보입니다. 누구든지 저에게 자세한 설명을 줄 수 있습니까? 정말 감사합니다.

답변:


92

인터페이스는 클래스의 속성과 작업을 정의하는 곳입니다. 구현도 설정해야합니다.

프로토콜은 자바 용 인터페이스와 같습니다.

예 :

@protocol Printing
    -(void) print;
@end

구현 가능

(인터페이스에서 혼란스럽게) 선언하여

@interface Fraction: NSObject <Printing, NSCopying> {
//etc..

자바 개발자에게 혼란스러운 점은 중괄호 {}가 인터페이스의 끝이 아니라는 것입니다.

@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는 프로토콜의 인터페이스 개념을 포함하여 Java에서 상당히 많이 끌어 왔다는 것을 기억하는 데 도움이됩니다. virtualschool.edu/objectivec/influenceOnJava.html Java가 동일한 이름을 유지했다면 덜 혼란 스러웠을 것입니다. 그러나 Java에는 (C / C ++에서) " 인터페이스 "를 참조하십시오.
Quinn Taylor

22
@QuinnTaylor 나는 'Java가 더 잘한다'고 말하고 싶지 않았지만 OP가 Java 언어와 관련하여 질문을 할 때 그렇게 표현했습니다.
Johnno Nolan

2
Objective C만의 관점에서 둘의 차이점은 무엇입니까? 둘 다 특정 메서드를 기반으로 형성된 클래스에 의해 구현되도록 강제하는 것 같습니다. 유일한 차이점은 프로토콜은 클래스없는 반면 인터페이스는 구현되어야한다는 것입니까?
SexyBeast

부정직 한 부분은 프로토콜이 추상 클래스가 아니라 COM dispinterface와 비슷하다는 것입니다. 모든 스몰 토크 객체는 c ++ 객체에서와 같이 .x 또는 .y (c와 유사 myObject.lpVtbl->x(&myObject))가 아니라 c 와 유사한 이중 인터페이스를 통해 메시지를받습니다 myObject.lpVtbl->Invoke(&myObject, "x", &argArray);. 이로 인해 프로토콜과 인터페이스는 런타임을 생성하고 시간 유형 검사를 컴파일하기위한 정보를 컴파일러에 제공하는 것으로 보입니다. 따라서 프로젝트에 스크립트 엔진 / COM을 도입하지 않는 한 C ++에는 진정한 병렬이 없습니다.
Dmitry

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

@실험 계획안

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

위의 예제 @protocol는 몇 가지 일반적인 메서드를 @interface정의하고 몇 가지 사용자 지정 메서드를 정의하며 @implementation해당 인터페이스를 구현합니다. @interface구현이 없습니다. 또한 foo방법이 프로토콜의 방법과 동일하므로 인터페이스에서 반복하지 않아야합니다.
SMMousavi

와, 그 기사를 더 빨리 찾았 으면 좋았을 텐데요. C ++에서 Obj로 오는 데 매우 유용합니다. C, 적극 권장 하는 위치에있는 다른 사람 은 답변에 링크기사확인하는 데 시간을 할애합니다 .
user7804781

15

@interface목표 - C에서 자바 인터페이스와는 아무 상관이있다. 단순히 클래스의 공용 인터페이스 인 공용 API를 선언합니다. (그리고 이미 관찰 한 바와 같이 멤버 변수.) Java 스타일 인터페이스는 Objective-C에서 프로토콜이라고하며 @protocol지시문을 사용하여 선언됩니다 . Apple의 The Objective-C Programming Language 를 읽어야합니다. 책은 짧고 쉽게 접근 할 수있는 좋은 책입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.