문제

프로토콜을 채택 할 인스턴스 변수 개체를 원합니다.

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer *content <CocosNodeOpacity>;
}

예를 들어 내 레이어 개체가 <CocosNodeOpacity> 방법을 얻을 수 있도록

-(GLubyte) opacity;    //and
-(void) setOpacity: (GLubyte) opacity;

무료로. 위에 표시된 구문은 유효하지 않습니다. 새 구현 파일을 만들고 사용자 정의 객체를 만들지 않고이를 달성 할 수 있습니까? 감사.

도움이 되었습니까?

해결책

이것들이 당신이 만든 모든 코드라면, 이것을하는 가장 좋은 방법은 아마도 Layer 클래스 자체는 변수가 아닌 프로토콜을 채택합니다.

@interface Layer : NSObject <CocosNodeOpacity> { ... }

이 접근법의 주요 이점은 컴파일러가 컴파일 타임에 프로토콜에서 필요한 모든 방법을 구현했는지 여부를 확인하는 것입니다. 이는 일반적으로 원하는 것입니다. 표준 클래스 구현의 나머지 부분과 동일한 위치에 방법을 추가하는 것은 이해하기가 더 쉽습니다 (마법 코드가 어디에서 왔는지 찾기 위해 사냥이 없음) 카테고리를 사용하는 것보다 깨지기 쉬운 (다른 범주를 통해 동일한 방법을 추가하면 정의되지 않은 동작이 발생할 수 있음) . 일반적으로 저는 카테고리 만 사용합니다. 가지다 (폐쇄 소스) 타사 코드에 메소드를 추가하는 것과 같은.

소스를 제어하지 않는 경우 Layer, ivar를 선언 할 때 대신 이것을 사용해야 할 수도 있습니다.

Layer<CocosNodeOpacity> *content;

프로토콜을 채택하면 클래스 유형으로 정적으로 변수를 입력하고 메소드가없는 경우 컴파일 경고를 얻을 수 있습니다. 그러나 여전히 구현해야하기 때문에 "무료"방법을 얻지 못합니다. 그럼에도 id 모든 것을위한 유형으로. 당신은 쉬운 길을 가지 않고 칭찬을 받아야합니다. :-)

프로토콜에 대한 몇 가지 세부 사항 (필수 및 선택적 방법 포함)은 이렇게 대답합니다.

다른 팁

Objective-C의 프로토콜은 Java의 인터페이스와 유사합니다. 프로토콜은 일련의 함수를 정의하고 계약으로 작용합니다. "이 객체가 무엇이든, 이러한 방법이 있다고 보장하는 것과 같습니다."

첫 번째 코드 블록의 구문에 매우 가깝습니다. 실제로는 다음과 같이 보입니다.

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer<CocosNodeOpacity> * content;
}

그러나 레이어 클래스에서 불투명도 방법을 정의하지 않아도됩니다. 프로토콜을 사용하여 클래스에 해당 기능이 있지만 실제로 제공하지 않았 음을 확인했습니다. 여전히 코드를 작성해야합니다.

나는 당신이 찾고있는 것이 객관적인 C 범주라고 생각합니다. 카테고리는 런타임에 메소드를 추가하여 클래스의 기능을 확장하는 방법을 제공합니다. Objective-C는 완전히 역동적 인 언어이기 때문에 가능합니다. 당신이 레이어 클래스의 저자가 아니고 불투명도 방법을 쉽게 추가 할 수 없다면, 카테고리가가는 길입니다. 경우에 따라 카테고리가 매우 유용합니다. 기존 클래스 소스가 없으면 NSString 및 NSColor와 같은 내장 클래스에 메소드를 추가 할 수 있습니다.

스택 오버플로에는 카테고리에 대한 문서가 많이 있습니다. 사과 문서도 매우 좋습니다. 다음은 시작할 기사입니다.

http://macdevelopertips.com/objective-c/objective-ccateories.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top