1、成員訪問類型
private:私有成員,不能被外部函數訪問(使用),也不能被子類繼承;
protected:保護成員,不能被外部函數訪問,可以被子類繼承;
public:公有成員,可以被外部函數訪問,也可以被子類繼承。
OC中,所有的方法(消息),都是公有的。
2、重寫(繼承的另一部分)
子類可以從父類繼承方法,但是有時候父類的方法不適合子類,子類就可以寫一個自己的同名方法,覆蓋掉父類的同名方法,叫做重寫。
重寫的時候,在子類的.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方法,不需要重新聲明。
同一個方法,不同的實現,稱為多態。重寫是多態的一種。
繼承的好處:
1)創建大量的相似類的時候,可以節省工作量。
2)使用框架中的類,或已經寫好的類,繼承該類,生成一個派生類,比原類更好用。
注意:NSString、NSArray、NSDictionary都是不能夠繼承的。
3、虛方法
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...
結題!!!