避免为仅抽象的父类导入头 我开发了一个可可数据结构库来补充基础知识。它包括共享公共实现细节的(堆栈、队列和出列),因此使用公共父类设计它们是有意义的,我将其视为抽象类(Objective-C本机不强制执行此概念)。例如,封装了几乎所有结构的逻辑,这些结构在封面下使用了循环缓冲区。它的子类继承核心行为,并符合适当的协议,因此只添加与该协议相关的方法。(因此队列不会公开堆栈方法等)

避免为仅抽象的父类导入头 我开发了一个可可数据结构库来补充基础知识。它包括共享公共实现细节的(堆栈、队列和出列),因此使用公共父类设计它们是有意义的,我将其视为抽象类(Objective-C本机不强制执行此概念)。例如,封装了几乎所有结构的逻辑,这些结构在封面下使用了循环缓冲区。它的子类继承核心行为,并符合适当的协议,因此只添加与该协议相关的方法。(因此队列不会公开堆栈方法等),objective-c,inheritance,import,abstract-class,header-files,Objective C,Inheritance,Import,Abstract Class,Header Files,这一切都很好,正确性和覆盖率都很高。然而,当前方法的缺点是每个具体的子类都有一个#import来包含抽象父类的头(请参见和)-这意味着我必须导出父类头,以便客户机代码能够编译。如果有一种方法可以在头中使用@class,而不是#import,这样调用代码就不必知道或关心抽象父类,这将是一种理想的方法。(它还将简化并略微缩小框架的大小。)然而,当我尝试以下方法时: // CHCircularBufferQueue.h #import "CHQueue.h" @class CHAbstractCirc

这一切都很好,正确性和覆盖率都很高。然而,当前方法的缺点是每个具体的子类都有一个
#import
来包含抽象父类的头(请参见和)-这意味着我必须导出父类头,以便客户机代码能够编译。如果有一种方法可以在头中使用
@class
,而不是
#import
,这样调用代码就不必知道或关心抽象父类,这将是一种理想的方法。(它还将简化并略微缩小框架的大小。)然而,当我尝试以下方法时:

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

@interface CHCircularBufferQueue : CHAbstractCircularBufferCollection <CHQueue>

@end
//CHCircularBufferQueue.h
#导入“CHQueue.h”
@类CHAbstractCircularBufferCollection;
@接口CHCircularBufferQueue:CHAbstractCircularBufferCollection
@结束
即使我在.m文件中导入CHAbstractCircularBufferCollection.h,也会出现此错误:

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

我希望编译器知道我要扩展的父类,但不要求客户机知道。有没有办法完成我想做的事情,并从我的发行版中删除不相关的头文件


PS——这个框架主要来源于学术上的好奇心,但是我正在考虑通过使用类簇和私有子类进行改变以使它更像基础集合。这也可以解决这个问题,但我很好奇是否有可行的方法来实现我的要求。

如果你想继承一个类,必须知道超类的@接口(因此整个超类层次结构),这样子类的ivar偏移量就可以计算出来

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

#import <Foundation/NSObject.h>
#导入

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

因为您是第一个得到正确答案的类而被接受:父类是唯一必须导入的类头。有趣的是,现代运行时可以不使用头,但是@bbum说“我们还没有到那里”——这是因为传统运行时的负担。