导入类的头文件和继承类有什么区别?
Person.h:
#import <Foundation/Foundation.h>
@interface Person:NSObject
{float fromPerson;}
-(void)inPerson;
@end
案例1 - 在Employee.h中导入Person.h
#import "Person.h"
@interface Employee:NSObject
{float fromEmployee;}
-(void)inEmployee;
@end
案例2 - 将Person.h继承到Employee.h
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Employee:Person
{float fromInheritedEmployee;}
-(void)inInheritedEmployee;
@end
答案 0 :(得分:3)
使用预处理程序指令导入是预处理程序的工作, 显然,它在实际编译之前运行。该指令是 解释为“把 Person.h 的内容放在这里”,所以就是这样 就像你在 Enployee.h 中复制并粘贴 Person.h 的内容一样。
实际上,这使编译器知道包含的定义
在 Employee.h 中。所以,如果你使用Employee
类的对象(即
在 Employee.h 中声明,它将知道如何处理它。
这与继承无关,这是完全不同的 你应该仔细看看你最喜欢的OOP书或者 文档。
文件名是完全独立的,不要让你欺骗。 Person.h
可以称为 Being.h 并包含更高生物的类定义
在同一个文件中,然后导入它会将它的定义放在里面
文件 Employee.h ,它不会影响哪个类
Employee
继承。
答案 1 :(得分:2)
导入头文件只是将其内容复制到当前文件,例如声明,宏,枚举等。
继承一个类意味着您现在声明的类是继承类的子类,例如员工是一个人。
答案 2 :(得分:1)
导入(或包含)文件类似于在#import语句的位置注入该文件的内容。
在Objective-C #import比普通的C#更聪明,因为如果一个文件先前已经在嵌入的#import链中注入,那么它将不再被注入。正常的C(预处理器)#include不够聪明,无法弄清楚这就是为什么你总是看到像
这样的结构 #ifndef __FOO_H
#define __FOO_H
.... header content here ...
#endif /*__FOO_H */
在C标题中确保单个包含,而在目标C中没有看到这样的结构。
这就是#import
的全部内容:内容注入机制。
所以,举个例子,让我说我想创建一个Person类的实例,我必须先#import它的定义才能做到。 :
/* main.m */
#import "Person.h"
int main(int argc, char *argv[]) {
Person *person = [[Person alloc] init];
//^^^^^^^^ this won't work without the #import statement
[person release];
return 0;
}
请注意,没有任何内容被继承,#import只是注入了在main.m中使用Person
类所需的所有部分
正如您可能已经知道的那样,继承是一种将新类定义为另一个类的扩展的机制。通常,新类是父类的子类(想想动物王国),但并非总是如此。
在您自己的示例中,您将Employee定义为Person的子类。
为了使用任何的类,你需要#import它的定义,以便当你说Person
时编译器知道你在说什么,那包括(双关语)意图)创建一个派生类。