2011-04-28 4 views
0

나는 프로토콜과 같이 있습니다정의 조건은

@protocol ProfileSubObjects <NSObject, NSCoding> 
@required 
- (BOOL) hasGraph; 

@optional 
- (NSArray *) xGraphValues; 
- (NSArray *) yGraphValues; 

내가 hasGraph은 YES와 같은 경우는이 두 가지 선택 방법을 요구 만들고 싶어. 가능합니까?

+1

그걸로 무엇을 이루고자합니까? – Jano

답변

1

아니요. 메소드가 프로토콜에 필요하거나 그렇지 않습니다. 한 가지로, -hasGraph의 값은 컴파일 할 때 알려지지 않습니다. 클래스 메소드가 아닌 인스턴스 메소드이기 때문에 특정 객체를 작성할 때까지는 런타임에 알 수 없습니다. 또한 객체는 서로 다른 시간에 -hasGraph에 대해 다른 값을보고 할 수 있습니다.

여기서 가장 좋은 점은 -hasGraph가 YES를 반환하면 -xGraphValues ​​및 -yGraphValues가 구현되어야한다는 사실을 간단하게 문서화하는 것입니다. 예외를 던지거나, 정상적으로 작동하지 않을 수 있으며 그런 방법을 구현하지 않으면 데이터를 그릴 수 없습니다. 메서드를 호출하기 전에 구현되었는지 여부를 확인하려면 -respondsToSelector : 메서드를 사용하십시오.

0

그건 불가능합니다. hasGraph의 결과는 런타임시에만 알려지며 프로토콜의 필수/선택 부분은 컴파일 타임에 컴파일러가 체크 아웃하는 데 사용됩니다.

아마도 hasGraph가 YES를 반환하면 xGraphValues ​​및 yGraphValues가 구현되어야하며 공식 프로토콜에 약간의 비공식 성을 가져야한다는 강점을 추가하는 것이 좋습니다. 객체가의 특정 작업을 수행 할 수 있도록 당신이 위해 필요한 프로토콜의 부분을 구현하는지 여부를 런타임에 확인하려면

if([object respondsToSelector:@selector(xGraphValues)] && 
    [object respondsToSelector:@selector(yGraphValues)]) 

: 당신은 항상 뭔가를 할 수 있습니다. 비 순응 객체를 구현하는 누군가가 디버그 빌드를 통해 잘못한 것을 찾을 수있게하려면 NSAssert에 그러한 것들을 넣는 것이 현명 할 것입니다.

1

아니요, 불가능합니다. 적어도, 이것처럼. 그러나 더 깊은 문제가 있습니다. 이 질문은 컴파일 대 런타임 검사와 객체 지향에 대한 고려를 제안합니다.

@optional 또는 @required로 표시하는 것은 해당 객체가 구현을 제공하는 프로토콜 계약을 충족하는지 또는 해당 메소드의 @optional 인 경우가 아닌지 컴파일 시간 검사를 수행하고자 함을 의미합니다.

따라서 런타임 변수의 값 (이 경우 hasGraph)에 따라 컴파일 시간을 확인할 필요가 없습니다.

더 나은 방법은 respondsToSelector 메시지 확인을 이용하는 것입니다. 또는 그래프가 있고 x와 y 그래프 값을 제공하는 하위 클래스를 가질 수 있습니다.

관련 문제