學了一點物件導向的觀念之後,應該還有很多東西看起來還是霧茫茫吧;接下來介紹的是物件導向另一個很重要的概念:繼承。
繼承是什麼?簡單來說,就是…繼承阿@@。
例如,兒子繼承(遺傳)了老爸的卷髮和身高,老媽的眼睛顏色和長相。當然兒子也會有自己發展的東西,如-->體重,說話的語言等等。
那如果今天兒子看膩了卷髮,怎麼辦?去離子燙就好啦。OK,以上面這段話來看程式的架構:
上圖所示,類別B和C分別繼承了類別A;而在類別B裡,他"override"了Method2(可看成把卷髮弄成直髮);而類別C則是新增了一個Method3(可看成會說新的語言)。
所以以這個圖來看,類別A就通稱為"超類別"(好像也可以叫做父類別),而類別B及類別C就通稱為"子類別"。超類別與子類別是相對應的。例如類別B繼承了類別A,類別C又繼承了類別B,那麼對類別B來說,類別A就是他的超類別;而對類別C來說,類別B則是他的超類別。
當然了,每個人都會有源頭,例如人類的源頭是亞當與夏娃(?),程式也會有最原始的起頭-->就是沒有超類別的類別:根類別(root class)。在Cocoa環境裡(Object C生出來的一個架構),他的根類別是一個叫做NSObject的類別;當我們新增一個類別時,如果沒有要繼承已存在的類別,就一定要去定義他。而不是每個程式語言都只有一種根類別,像C++,Object C就有複數個根類別,而單一根類別的則有Java等。
我們來看之前的程式碼:
@interface Tempeature : NSObject
{
int val;
int min, max, step;
}
由於這是我們新產生的類別,沒有可以參考的對象,因此在超類別的位置,我們就必需寫上根類別-->"NSObject"。
接下來把上圖的對應關係寫出來吧:
@interface B: A
-(void) Method2;
@end
@interface C: B
{
id Y;
}
-(void) Method3;
@end
不管是要override的,還是新增的,都要在介面段去做一個宣告,而像變數X,Method1,就不需要另外做宣告。
需注意的是,在介面的區段的部分通常都會做成標頭檔(*.h),且新的類別都常都會帶一個標頭檔,如ABC.m<-->ABC.h。
當類別DEF繼承了ABC,那對於DEF的標頭檔來說,他還需要去引用(import)繼承到的類別所屬的標頭檔,不然他會不知道繼承到了什麼東西,最直接的說法就是,build code會產生錯誤囉。而最源頭,當然就是NSObject.h啦;不過他會放在Foundation下面,因此引用的時候要多一層,寫成Foundation/NSObject.h