导入.h文件和继承类之间的区别

时间:2012-08-07 21:48:00

标签: objective-c xcode

导入类的头文件和继承类有什么区别?

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

3 个答案:

答案 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)

#include vs #import

的入门读物

导入(或包含)文件类似于在#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相关?

为了使用任何的类,你需要#import它的定义,以便当你说Person时编译器知道你在说什么,那包括(双关语)意图)创建一个派生类。