OC繼承

一、成員訪問類型框架

private:私有成員,不能被外部函數訪問(使用),也不能被子類繼承;函數

protected:保護成員,不能被外部函數訪問,能夠被子類繼承;spa

public:公有成員,能夠被外部函數訪問,也能夠被子類繼承。指針

OC中,全部的方法(消息),都是公有的。code

二、重寫(繼承的另外一部分)對象

子類能夠從父類繼承方法,可是有時候父類的方法不適合子類,子類就能夠寫一個本身的同名方法,覆蓋掉父類的同名方法,叫作重寫。blog

重寫的時候,在子類的.h中沒必要從新聲明,直接在.m中寫實現就能夠。繼承

 1 //父類聲明文件
 2 #import <Foundation/Foundation.h>
 3 @interface Father : NSObject
 4 -(void)run;
 5 -(void)jump;
 6 @end
 7 
 8 //父類實現文件
 9 #import "Father.h"
10 @implementation Father
11 -(void)run{
12     NSLog(@"he is running!");
13     return;
14 }
15 -(void)jump{
16     NSLog(@"father can jump 1.2m");
17 }
18 @end
 1 //子類聲明文件
 2 #import "Father.h"
 3 
 4 @interface Son : Father
 5 
 6 @end
 7 
 8 //子類實現文件
 9 #import "Son.h"
10 
11 @implementation Son
12 -(void)jump{
13      NSLog(@"he can jump 0.6m");
14 }
15 @end

其中,子類重寫父類的jump方法,不須要從新聲明。事件

同一個方法,不一樣的實現,稱爲多態。重寫是多態的一種。it

繼承的好處:

  1)建立大量的類似類的時候,能夠節省工做量。

  2)使用框架中的類,或已經寫好的類,繼承該類,生成一個派生類,比原類更好用。

注意:NSString、NSArray、NSDictionary都是不可以繼承的。

三、虛方法

OC的方法都是虛方法

  1)父類的指針能夠指向子類的對象

1 Son * son = [[Son alloc] init];
2 Father * p = son;

上面p和son都指向子類的對象;調用方法時,不看指針,看對象,對象的地址指向什麼對象,就調用什麼方法,稱爲虛方法。

  2)調用方法時,不看指針看對象,這樣的方法叫作虛方法。虛方法的好處:能夠描述不一樣事物被相同事件觸發,產生不一樣的響應(結果)。體會下面的例子

動物的父類聲明與實現

1 //動物類聲明
2 #import <Foundation/Foundation.h>
3 @interface Animal : NSObject
4 -(void)beBeaten;
5 @end
1 //動物類實現
2 #import "Animal.h"
3 @implementation Animal
4 -(void)beBeaten{
5     return;      //該方法須要子類實現,因此父類不須要寫任何實現代碼
6 }
7 @end

子類(狗)的聲明與實現

1 #import "Animal.h"
2 
3 @interface Dog : Animal
4 
5 @end
1 #import "Dog.h"
2 
3 @implementation Dog
4 //該方法在父類已經聲明,因此子類不須要重複聲明
5 -(void)beBeaten{
6     NSLog(@"wang,wang...");
7 }
8 @end

子類(貓)的聲明與實現

1 #import "Animal.h"
2 
3 @interface Cat : Animal
4 
5 @end
1 #import "Cat.h"
2 
3 @implementation Cat
4 //該方法在父類已經聲明,因此子類不須要重複聲明
5 -(void)beBeaten{
6 NSLog(@"miao,miao...");
7 }
8 @end

人類的聲明與實現

1 #import <Foundation/Foundation.h>
2 #import "Animal.h"
3 @interface Human : NSObject
4 //調用該方法,此處只寫一個父類的指針就能夠,這是利用了父類的虛方法;
5 //否則,須要寫多個方法實現:beatAnimal:(Dog *)dog;beatAnimal:(Cat *)cat;打不一樣的動物須要傳不一樣的對象,因此利用虛方法、父類的指針是很是方便的
6 -(void)beatAnimal:(Animal*)animal;
7 @end
1 #import "Human.h"
2 
3 @implementation Human
4 -(void)beatAnimal:(id)animal{
5     NSLog(@"Human beat the %@",[animal class]);
6     [animal beBeaten];
7 }
8 @end
 1 Dog * dog = [[Dog alloc] init];
 2 Cat * cat = [[Cat alloc] init];
 3 Human * xiaoming = [[Human alloc] init];
 4 [xiaoming beatAnimal:dog];
 5 [xiaoming beatAnimal:cat];
 6 //輸出:
 7 //2013-09-29 15:51:00.604 OC[752:303] Human beat the Dog
 8 //2013-09-29 15:51:00.619 OC[752:303] wang,wang...
 9 //2013-09-29 15:51:00.620 OC[752:303] Human beat the Cat
10 //2013-09-29 15:51:00.621 OC[752:303] miao,miao...

 

結題!!!

相關文章
相關標籤/搜索