3

나는 Foundation에서 이들을 보완하기 위해 코코아 데이터 구조 라이브러리 인 CHDataStructures을 개발합니다. 일반적인 구현 세부 사항을 공유하는 a fair number of classes (스택, 대기열 및 대기열에서 제외)을 포함하므로 추상으로 취급하는 공통 상위 클래스 (Objective-C는 기본적으로이 개념을 시행하지 않음)로 디자인하는 것이 좋습니다. 예를 들어, CHAbstractCircularBufferCollection은 커버 아래 순환 버퍼를 사용하는 구조의 거의 모든 로직을 캡슐화합니다. 그 자식 클래스는 핵심 동작을 상속하고 적절한 프로토콜을 준수하므로 해당 프로토콜과 관련된 메서드 만 추가됩니다. 큐가 스택 메소드 등을 노출시키지 않는다.추상 전용 부모 클래스의 #import 헤더 피하기

이것은 잘 작동하고 있으며, 정확성과 적용 범위는 verifiable via unit tests이다. 그러나 현재 접근 방식의 단점은 각 구체적인 하위 클래스가 추상 부모 클래스 (this headerimplementation 참조)에 대한 헤더를 포함하기 위해 #import이라는 점입니다. 즉, 클라이언트 코드가 컴파일되도록 부모 클래스 헤더를 내 보내야합니다. #import 대신에 @class을 헤더에 사용하는 방법이 있으면 호출 코드가 추상 부모 클래스를 알아야하거나 신경 쓰지 않아도되는 것이 이상적입니다. (또한 프레임 워크의 크기를 축소 소폭 단순화하고있다.) 그러나, 나는이 때 :이 오류가

// CHCircularBufferQueue.h 
#import "CHQueue.h" 
@class CHAbstractCircularBufferCollection; 

@interface CHCircularBufferQueue : CHAbstractCircularBufferCollection <CHQueue> 

@end 

을 경우에도 i를하는 .m 파일에 #import CHAbstractCircularBufferCollection.h :

'CHAbstractCircularBufferCollection'에 대한 인터페이스 선언의 슈퍼 클래스를 찾을 수 없습니다 'CHCircularBufferQueue'

내가 컴파일러는 내가 확장하고있어 상위 클래스에 대해 알고 있지만, 클라이언트가 필요하지 싶다. 내가하고 싶은 일을 성취하고 배포에서 관련없는 헤더를 제거 할 수있는 방법이 있습니까?

PS -이 프레임 워크는 주로 학술적 호기심에서 비롯되었지만 클래스 클러스터 및 개인 서브 클래스를 사용하여 Foundation 컬렉션과 같은 기능을하도록 변경했습니다. 또한이 문제를 해결할 수 있지만, 내가 원하는 것을 할 수있는 실현 가능한 방법이 있는지 궁금합니다.

답변

2

클래스를 상속하려면 하위 클래스의 ivar 오프셋을 계산할 수 있도록 수퍼 클래스의 @interface (따라서 수퍼 클래스 전체)를 알아야합니다.

+0

최초 답변을 한 이후로 허용됩니다. 상위 클래스가 ** 가져와야하는 유일한 클래스 헤더입니다. 흥미롭게도 Modern Runtime은 머리말 없이도 할 수 있지만, @bbum은 "우리가 거기에 가지 않았다"고 말합니다. 대부분의 경우 기존의 런타임 수하물 때문에 그랬습니다. –

2

수퍼 클래스의 .h 파일은 #import이어야합니다. Kenny가 지적했듯이, 이것은 컴파일러가 객체 구조체에 대한 ivar 오프셋을 계산할 수 있도록하기위한 것입니다. Cocoa 헤더 파일에서이를 볼 수 있습니다. 당신이 NSArray.h을 열 경우, 예를 들어, 첫 번째 비 주석 행은 다음과 같습니다

#import <Foundation/NSObject.h> 

이 코코아의 다른 모든 클래스에 대한 진정한 보유하고 있습니다.

관련 문제