2012-05-04 2 views
1

클래스를 프로토콜의 일반적인 구현으로 어떻게 장식합니까?범주와 함께 프로토콜을 총체적으로 구현하려면 어떻게해야합니까?

죄송합니다. 분명한 질문 일 수 있습니다. 나는 객관적인 C를 처음 접했고 아직 물을 조금만 걷고 있습니다.

@interface Widget : NSObject <SelectableElement> 
@end 

@interface Duhicky : NSObject <SelectableElement> 
@end 

내가 '무엇 : 내가 선택할 수하고자하는 객체의 몇 가지를 가지고

@protocol SelectableElement <NSObject> 
@property BOOL selected; 
@end 

:

은 내가 일반적인 구현을하고자하는 프로토콜있어 이렇게하려면 일단 프로토콜의 구현을 작성하고 두 객체 모두 그렇게 구현하는지 확인해야합니다.

나는 일반적인 범주를 쓸 수 있다고 생각하고 모두에 바인딩, 그래서 그것을 공통 클래스 NSObject의의 범주 구현 추가하는 것입니다 수행하는 하나의 방법 생각하지 않습니다의

@implementation NSObject (Selectable) 
- (BOOL)selectable 
{ 
    if (![self conformsToProtocol:@protocol(SelectableElement)]) return; 

    return YES; // Use associative storage for this? 
} 

- (void)setSelectable:(BOOL)selectable 
{ 
    if (![self conformsToProtocol:@protocol(SelectableElement)]) return; 

    // set this associatively? 
} 
@end 

을 물론,이 작업을 수행하기 위해 속성 변수를 정의 할 수는 없지만 여기서는 설명하지 않은 연관 객체 저장소를 사용해야합니다.

선택 가능한 요소 프로토콜을 구현하는 모든 것에 선택 ​​가능한 동작을 일반적으로 추가하는 유일한 방법입니까? 아니면 제가 놓친 분명한 방법이 있습니까?

이 간단한 예제를 구현하기 위해 상속을 사용할 수 있지만이 방법으로 단일 프로토콜을 구현하는 경우에만 작동합니다. 내가 자연적으로 적합하다고 생각했던이 접근법인가요, 아니면 해킹입니까? 조

답변

1

는 프로토콜 예를 구현하는 클래스를 확인합니다. SelectableObject을 입력 한 다음 WidgetDuhicky 클래스가 SelectableObject를 상속 받도록합니다.

+0

+1 : 또는 위젯과 Duhicky 클래스는 SelectableObject의 하위 클래스 여야합니다. – lnafziger

0

Rubin에서 Mixin과 같은 것을 원하는 것 같습니다. 불행히도 Objective-C의 언어 수준에서는 이것이 불가능합니다. 행동을 공유하는 유일한 방법은 상속을 통해서입니다.

즉, Objective-C 런타임을 사용하여 원하는 것을 달성 할 수 있습니다. 사용하고있는 언어와 비교해 보지 않는 것이 좋습니다.이 옵션을 살펴 보려면 다음을 살펴보십시오. http://cocoadev.com/wiki/MethodSwizzling

0

슬프게도 이것은 상속이 특히 적합하지 않은 경우 중 하나입니다. 문제.

그러나 Cocoa 프레임 워크에서이 (ab) 상속을 볼 수 있습니다 (NSResponder 또는 UIResponder). 상속 구조 (외부 프레임 워크의 일부 객체)를 제어하지 않으면 객체를 선택 가능하게해야하는 경우 문제에 대비하여 실행됩니다.

NSObject에 대한 귀하의 카테고리가 작동합니다.이 경우이 설정을 사용하는 것이 좋습니다. 언뜻보기에 모든 객체가 이러한 방법을 수행하기 위해 무거워 보이지만 caching in the method lookup mechanism으로 인해 성능 패널티가 작습니다.