zoukankan      html  css  js  c++  java
  • 第二条、在类的头文件中尽量少引入其他头文件

    第二条、在类的头文件中尽量少引入其他头文件

    当我们在一个类中去引入另一个类的时候,我们经常会这样使用:

    #import "xxxx.h"
    这是一种常见的方法,但是不够优雅。举个例子。在Driver类中
    Driver.h

    #import <Foundation/Foundation.h>
    
    @interface Driver : NSObject
    
    @property(nonatomic)NSString *name;
    @property(nonatomic)NSString *driverCard;
    @end
    

    当我们想在该类中引入Car类时,即:

    @property(weak)Car *myCar;
    

    很明显我们一般都是:

      #import "Car.h"   
    

    但是我们在编译一个使用了Driver类的文件时,我们不需要知道Car类的全部细节,只需要知道有个类名叫Car就好,所幸有个方法能把这个情况告诉编译器:

    @class Car;   
    

    此时Driver.h文件如下:

    #import <Foundation/Foundation.h>
    @class Car;
    @interface Driver : NSObject
    
    @property(nonatomic)NSString *name;
    @property(nonatomic)NSString *driverCard;
    @property(weak)Car *myCar;
    @end
    

    这叫做“向前声明(forward declaring)”该类。
    Driver类的实现文件则需要引入Car的头文件,因为要使用Car,则必须要知道其所有接口细节。于是Driver实现头文件就是:
    Driver.m

    #import "Driver.h"
    #import "Car.h"
    @implementation Driver
    
    @end
    

    将其引入头文件的时机尽量延后,只在有需要的时候才引入,这样就可以减少类的使用者所需引入的头文件的数量。加入本例把Car.h引入到Driver.h中,那么只要引入Driver.h,就会一并引入Car.h中的所有内容。此过程若持续下去,则要引入许多根本用不到的内容,这样会增加编译时间。

    总结

    • 除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合(coupling).
    • 有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,应尽量把“该类遵循某协议”的这条声明移至“class-continuation分类中”。如果不行的话,就把协议单独放在一个头文件中,然后将其引入。
  • 相关阅读:
    em和rem
    uniapp小程序 插槽 使用 template 失效!
    大半夜睡不着,来个雪花动画
    opencv 修改像素为透明色
    C++ unsigned char 和 char 的转换示例(数组没试)
    切割矩形,C++版
    清除blob生成图片的缓存
    C++ 固定长度的队列
    Chrome神器Vimium快捷键学习记录
    ASC简介
  • 原文地址:https://www.cnblogs.com/zhanggui/p/4704767.html
Copyright © 2011-2022 走看看