2012-10-02 4 views
0

@protocol 내에서 Object 메소드를 사용하고 있지만 프로토콜은 메소드 선언 만 지원하므로 다른 메소드와 동일한 메소드의 메소드 정의를 연결하는 방법에 대한 도움을받을 수 있습니다. (메소드 정의를 작성하는 곳).프로토콜의 메소드 정의

+0

여기 몇 가지를 혼란스럽게 생각합니다. 메소드 * 구현 *을 어디에 둘 것인지요? – DrummerB

+2

프로토콜 사용법을 이해하려면 ['protocol documentation'] (http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/chapters/ocProtocols.html)을 읽어보십시오. . – Joe

+0

'@class';를'@proxy' 선언 위에 놓습니다. – basvk

답변

1

프로토콜은 메소드 선언이없는 이행. 그것들은 가능한 (클래스) 세트를 특정 프로토콜을 구현하는 클래스로 제한하는 데 사용될 수 있습니다.

예를 들어 GasStation 클래스가있는 경우 스테이션에서 급유 할 수있는 물체의 종류 (클래스)를 제한 할 수 있습니다. 물론 당신은 단순히 같은 클래스 Vehicle의 후손으로 개체를 요구할 수 :

@interface GasStation : NSObject 
- (void)refuel:(Vehicle *)vehicle; 
@end 

@implementation GasStation 
- (void)refuel:(Vehicle *)vehicle { 
    [vehicle addFuel:100]; 
} 
@end 

그러나 이것은 jerrycan가 예를 들어 가득 할 수 있도록하지 않을 것입니다. 그러나 모든 유형의 객체가 전달되도록 허용하는 것은 나쁜 아이디어입니다. Cat의 인스턴스를 전달한 경우 addFuel: 메시지를 보내려고하면 오류가 발생하기 때문입니다.

@interface GasStation : NSObject 
- (void)refuel:(NSObject<RefuelableThing> *)thing; 
@end 

Vehicle됩니다

@protocol RefuelableThing 
@required 
- (void)addFuel:(float)fuel; 
@end 

이제 급유 할 수있는 개체의 유형을 제한하기 위해 해당 프로토콜을 사용할 수 있습니다

그래서 대신에 당신은 refuelable 클래스가 구현해야하는 프로토콜을 정의 물론 addFuel: 방법을 가지고 있으므로 Vehicle이 아니더라도 JerryCan은 별도의 버전을 구현할 수 있습니다.

0

프로토콜을 선언하면이를 준수하는 모든 클래스가 해당 프로토콜의 메서드를 구현할 수 있습니다. 프로토콜이 선언 된 헤더를 가져 와서 해당 클래스의 인터페이스에 프로토콜을 추가하고 주제를 읽는 .m의 메소드를 구현하는 것이 좋습니다. btw

관련 문제