2013-02-08 4 views
1

[NSDate distantPast][NSDate distantFuture] 메서드의 반환 유형이 id 인 이유는 무엇입니까? 이 메소드가 NSDate 포인터를 반환하지 않는 이유는 무엇입니까?[NSDate distantPast] 및 [NSDate distantFuture] 메서드가 ID를 반환하는 이유는 무엇입니까?

+0

관련 : [새로운 인스턴스를 만들 클래스 메소드 (http://stackoverflow.com/q/5987969) –

+0

** 업데이트 : ** 지금 현재, (HTTPS [그들이'있는 NSDate *를'반환 _do_] //developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/clm/NSDate/distantFuture). –

답변

5

다형성은 한 가지 방법으로 유효합니다.

NSDate의 하위 클래스를 만들고이 메서드를 재정의한다고 가정 해 보겠습니다. 이 서명으로 그것을 할 수 있습니다, 그래서 당신은 같은 서명을 사용합니다

-(NSDate*) distantPast; 

을하지만 당신은 하위 클래스 타입의 포인터 식의 결과를 할당 할 수 없을 것입니다, 당신은해야합니다 결과를 다운 캐스트 :

NSDateSubclass* ptr= (NSDateSubclass*)[someDateSubclassInstance distantPast]; 
// Downcasting is necessary here, it would give a warning or syntax error otherwise. 

은 반환 된 개체가있는 NSDate의 서브 클래스인지 확인하더라도, 당신은 결과를 다운 캐스트 할 필요가있다. 이것이 생성 된 객체를 반환하는 모든 메소드가 ID를 반환하도록 선언 된 이유입니다.

+1

** 업데이트 : ** 현재, [they _do_ return NSDate *'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/clm/NSDate/distantFuture). –

3

NSDate는 추상 슈퍼 클래스이며, distantPast 또는 NSDate의 개인 서브 클래스를 반환 distantFuture, 아닌 NSDate 자체.

+1

다형성이 유효하기 때문에 반환 유형은 NSDate 유형 일 수 있습니다. 모든 정적 메서드가 ID를 반환한다는 것을 알았습니까? –

+0

대부분의 인스턴스 메소드도 마찬가지입니다. – iluvcapra

1

나는 init 방법으로 무엇을 반환해야하는지 묻는 것과 같은 질문을한다고 생각하십니까? ID 또는 클래스에 대한 포인터입니다.

그런 경우에도 클래스 메소드에 대한 Apple의 표준화와 같은 표준화라고 생각할 수 있습니다.

1

특별한 이유는 없습니다. 다른 포스터는 이러한 메서드가 NSDate의 private 하위 클래스를 반환 할 수 있다고 지적했지만 NSDate의 하위 클래스는 여전히 NSDate입니다. 나는이 메소드가 id 반환 유형에 대한 이유가 역사적이며 "고대로부터 상실"이라는 이유로 오래된 메소드 (예 : Mac OS 이전의 NextStep)를 사용하고있는 것으로 추측합니다. (Mac OS 문서에서 이러한 방법을 살펴보면 Mac OS 10.0에서 정의되었다고 말합니다.)

오래된 학교 접근 방법은 어디서나 익명 객체 포인터를 사용하는 것이 겠지요.

+0

나는 그것을 나중에 깨달았습니다. 나는 그것도 생각했습니다. 그러나 다형성은 한 가지 방법으로 만 유효하므로이 메서드를 사용하여 하위 클래스 유형의 포인터를 초기화하려고하면 구문 오류 또는 경고가 발생하고 반환 유형을 다운 캐스팅해야합니다. –

+0

클래스 클러스터가 반환 형식'id'의 이유가 아니라는 것은 사실입니다. 슈퍼 클래스 리턴 타입을 통해 서브 클래스를 반환하는 것은 유효합니다 :'- (NSArray *) myArrayProperty {return _myInternalArrayWhichIsActuallyMutable; }'괜찮습니다. 상속이 문제입니다 :'+ [NSArray array]'가'(NSArray *)'를 반환하면 NSMutableArray * array = [NSMutableArray array];는 컴파일러를 불평하게 만듭니다. –