常見引入一個類的方法(頭文件):
#import "EOCEmployer.h" //這樣可行,但不夠優(yōu)雅废酷。
在編譯一個使用了 EOCPerson 類的文件時,不需知道 EOCEmployer 類的全部細節(jié),只需知道有一個類名為 EOCEmployer 就好引谜。可以這樣寫:
@class EOCEmployer;
這叫做“向前聲明”(forward declaring)該類擎浴。
將引入頭文件的時機盡量延后员咽,只在確有需要時才引入,這樣就可以減少類的使用者所需引入的頭文件數(shù)量贮预。也解決了兩個類相互引用的問題贝室。
若把 EOCEmployer.h 引入到 EOCPerson.h契讲,則只要引入 EOCPerson.h, 就會一并引入 EOCEmployer.h 的所有內容。此過程若持續(xù)下去滑频,則要引入許多根本用不到的內容捡偏,這當然會增加編譯時間。
如果在各自頭文件中引入對方的頭文件峡迷,則會導致“循環(huán)引用”(chicken-and-egg situation)银伟。雖然使用
#import
而非#include
不會導致死循環(huán),但兩個類其中一個無法正確編譯绘搞。
若一個類繼承自某個超類彤避,則必須引入定義那個超類的頭文件。
同理夯辖,若要聲明一個類遵從某個協(xié)議(protocol)琉预,該協(xié)議必須有完整定義,且不能使用向前聲明(向前聲明只能告訴編譯器有某個協(xié)議蒿褂,而此時編譯器卻要知道該協(xié)議中定義的方法)圆米。
要點:
- 除非有必要,否則不要引入頭文件啄栓。一般來說娄帖,應在某個類的 頭文件 中使用 向前聲明 來提及別的類,并在 實現(xiàn)文件 中 引入 那些類的頭文件昙楚。這樣做可以盡量降低類之間的耦合(coupling)块茁。
- 無法使用向前聲明時,盡量把“該類遵循某協(xié)議”這條聲明移至“class-continuation”中桂肌,或單獨放到一個頭文件中再引入数焊。