2014-01-24 4 views
1

this blog post에 이어 내가 직면 한 문제를 해결하는 방법을 발견했습니다.속성을 보호 된 것으로 선언하는 더 나은 방법

내 문제는, 자신처럼 있었다 나는 상속과 서브 클래스에 액세스해야하는 속성을 가진 클래스를 가지고 :

@interface A : NSObject 
@property (nonatomic, readonly) NSUInteger prop; 
@end 

@implementation A 
    // Don't need to synthesize nowadays 
@end 

@interface B : A 
    // No new properties 
@end 

@implementation B 

- (void)establishValueForProp 
{ 
    _prop = 1; // PROBLEM !!! 
} 

@end 

솔루션이 있었다 :

@interface A : NSObject { 
    @protected 
    NSUInteger _prop; 
} 
@property (nonatomic, readonly) NSUInteger prop; 
@end 

무엇 속성을 보호 된 것으로 선언하는 또 다른 방법이 있다면 궁금합니다.

답변

1

그 일의 또 다른 일반적인 방법은 이런 식으로 뭔가를 (예를 들어, ASubclass.h) 별도의 .H 파일을 생성하고 추가하는 것입니다 이 메소드에 대한 액세스. 카테고리는 속성을 추가 할 수 없으므로 A의 개인 interface (클래스 확장자)에이 속성을 다시 정의해야합니다. 카테고리는이 속성에 대한 공개 액세스를 제공합니다. 애플은 UIGestureRecognizer.h와 UIGestureRecognizerSubclass.h (UIGestureRecognizer.h는 서브 클래스가 오버라이드 (override) 할 수있는 메소드를 더 많이 제공함)를 사용하여 정확한 접근법을 취합니다.

보호 된 (또는 해당 사안에 대해) 메소드의 개념은 실제로 존재하지 않으며 이는 단지 유사한 기능을 다소 달성하는 방법 일뿐입니다.

개인적으로는 공용 속성을 노출하는 클래스의 (유일한) .h 파일에 범주를 만듭니다. 이렇게하면 주 공용 인터페이스와 구분되며, 사적 속성을 얻는 것이 가능하기 때문에이 방법이 충분하다고 생각합니다.

+0

코드 예제가 포함되어 있기 때문에 허용 됨 – michaelsnowden

+0

내 답변과 달리 주 클래스 인터페이스 또는 클래스 확장에서 속성을 별도로 재정의 (또는 접근기 메서드를 제공해야합니다.)해야합니다. 하위 클래스 머리글에서 명명 된 범주 대신 클래스 확장을 사용하면이 문제가 발생하지 않습니다. –

+0

@AndrewMadsen : 클래스 확장이 하나만 있다고 생각 했나요? 아니면 .h 당 하나의 클래스 확장인가? –

3

일반적으로 이렇게하는 방법은 두 번째 헤더를 만드는 것입니다. "ClassName_ForSubclasses.h". 헤더 파일 내부에서 하위 클래스가 호출하고 재정의 할 수있게하려는 속성 및 메서드가있는 클래스 확장을 추가합니다. 그런 다음 하위 클래스는 해당 헤더를 가져올 수 있지만 클래스의 다른 사용자는 헤더를 볼 수 없습니다. 사브 크라 다음이 .H를 가져올 수있을 것이다

@interface A (Protected) 

@property (nonatomic, readonly) NSUInteger prop; 

@end 

: