一、繼承:
先定義一個類:
@interface Animal : NSObject
{
NSString *name;
GCFloat height;
}
-(void)eat;
@end
定義一個子類:
@interface Dog :Animal
{
NSString *speed;
}
-(void)run;
@end
在上面定義的兩個類中:Animal 稱爲父類 Dog子類,後者繼承了前者。
分別定義一個實例變量:
Animal *animal
Dog *dog;
在Animal類對象animal中有實例變量name 和 height 和方法eat;
在Dog 子類的對象中有實例變量name、height和speed以及方法eat、run;
可以看到在子類繼承父類的過程中,子類繼承了父類的實例變量和方法。
這就是繼承,一個類擁有另一個類的屬性和方法的過程。
二、多態
一直有個疑問就是怎麼理解書上說的---“在調用類方法或者實例方法的時候所有可以用父類的地方都可以用其子類替換”
帶着這個疑問我們來剖析什麼是多態。
a、概念說明
->一種類型,多種形態
->在OC中表現爲父類指針可以指向父類對象,也可以指向子類對象
->直到運行期,根據父類指針實際指向的對象的類型,確定執行父類方法還是子類中重寫的方法
b、多態產生的條件
->必須有繼承關係;
->子類要重寫父類的方法;
->父類指針指向子類對象
c、好處與限制
->好處:使用多態後,可以用父類指針操縱所有的子類對象,程序的可擴展性就會增強
->限制:父類指針不能調用子類新增的方法(只能重寫的)
背景:有一個人有兩隻狗,它們品種不同,跑的速度不同。
聲明一個對象爲人的類
@interface Person :NSObject
{
}
-(void)testWhichDog:(Dog*)dog;
@end
聲明關於狗對象的類
@interface Dog : NSObject
{
NSString *name;
GCFloat height;
}
-(void)run;
@end
@interface Dog 1:Dog
{
NSString *speed1;
}
-(void)run;
@end
子類2
@interface Dog2 :Dog
{
NSString *speed2;
}
-(void)run;
@end爲什麼在 (void)testWhichDog:(Dog*)dog中參數要(Dog*)類型?
如果不寫成Dog*)類型而是Dog1* Dog2 *這種類型,當狗的數量很多則需要寫很多個函數,但是我們可以聲明成父類類型,就只需要寫一個方法就可以了。父類指針可以訪問子類中重寫的方法。