3

我开发了CHDataStructures,这是一个 Cocoa 数据结构库,以补充 Foundation 中的数据结构。它包括相当数量的类(堆栈、队列和出队),它们共享共同的实现细节,因此使用我视为抽象的公共父类来设计它们是有意义的(Objective-C 本身并不强制执行此概念) . 例如,CHAbstractCircularBufferCollection封装了几乎所有使用循环缓冲区的结构的逻辑。它的子类继承了核心行为,并符合适当的协议,因此只添加与该协议相关的方法。(因此队列不公开堆栈方法等)

这一直工作得很好,并且正确性和覆盖率可以通过单元测试来验证。然而,当前方法的缺点是每个具体子类都有一个#import包含抽象父类的标头(请参阅此标头实现)——这意味着我必须导出父类标头,以便客户端代码能够编译。如果有一种方法可以@class在标头中使用而不是#import,那将是理想的,这样调用代码就不必知道或关心抽象父类。(它也会简化并略微缩小框架的大小。)但是,当我尝试这个时:

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

@interface CHCircularBufferQueue : CHAbstractCircularBufferCollection <CHQueue>

@end

即使我#import CHAbstractCircularBufferCollection.h在 .m 文件中,我也会收到此错误:

找不到“CHCircularBufferQueue”超类“CHAbstractCircularBufferCollection”的接口声明

我希望编译器知道我正在扩展的父类,但不需要客户端。有没有办法完成我想做的事情,并从我的分发中消除不相关的标题?

PS - 这个框架主要源于学术好奇心,但我正在考虑通过使用类集群和私有子类进行更改,使其更像 Foundation 集合。这也可以解决这个问题,但我很好奇是否有可行的方法来做我所要求的。

4

2 回答 2

2

如果要继承一个类,则必须知道超类的@interface(因此整个超类层次结构),以便可以计算子类的 ivar 偏移量。

于 2010-01-12T16:31:13.663 回答
2

您必须拥有#import超类的 .h 文件。正如 KennyTM 指出的那样,编译器可以计算对象结构的 ivar 偏移量。您可以在任何 Cocoa 头文件中看到这一点。例如,如果您打开NSArray.h,则第一个非注释行是:

#import <Foundation/NSObject.h>

这适用于 Cocoa 中的所有其他类。

于 2010-01-12T16:47:14.453 回答