------ android培訓、java培訓、期待與您交流! ----------
OC基礎—三大特性之繼承
三大特性之繼承:用於類與類之間,繼承某個類就擁有了這了類的所有成員變量和方法
例子:
#import <Foundation/Foundation.h>
// ***********Animal類聲明*************
@interface Animal : NSObject
{
int _age;
double _weight;
}
// set與get方法
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
// ***********Animal類實現*************
@implementation Animal
// set與get方法聲明
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)setWeight:(double)weight
{
_weight = weight;
}
- (double)weight
{
return _weight;
}
@end
// *************dog類聲明***************
// 這裏:Animal就是代表繼承Animal,這裏: 就是繼承的意思,相當於擁有了Animal裏面的所有成員變量和方法
// Animal成爲Dog的父類,Dog成爲Animal的子類
@interface Dog : Animal
@end
// *************dog類實現***************
@implementation Dog
@end
int main( )
{
Dog *d = [Dog new];
[d setAge:10];
NSLog(@"狗的年齡是%d", [d age]);
return 0;
}
這裏Dog類就是繼承了Animal類,雖然Dog類中沒有寫變量和方法,但是繼承了Animal類就可以使用這個類中的所有成員變量和方法。
繼承的好處:
1. 抽取相同的代碼
2. 建立了類之間的關係
繼承的特點:子類可以擁有父類中所有的成員變量和方法。
注意!:基本上所有類的根類是NSObject
繼承的注意點:
1. 父類必須聲明在子類的前面(只關注聲明)
2. 子類不能擁有和父類相同的成員變量
3. 調用某個對象的方法時,優先在當前對象中找,如果找不到就去父類中找。(每個對象中都有一個isa指針指向類,每個類裏也有個指針superclass指向父類)
繼承缺點:類之間的耦合性太強(兩個類之間的關係太強,當某個類改變,另一個類以無法使用)。
例子:
#import <Foundation/Foundation.h>
// ********Person**********
@interface Person : NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age;
- (void)run;
@end
@implementation Person
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)run
{
NSLog(@"Person跑起來了");
}
@end
// *******Student**********
@interface Student : Person
{
int _no;
// 不允許子類和父類擁有相同變量的成員變量
//int _age;
}
- (void)run;
@end
@implementation Student
// 重寫:子類重新實現父類中的某個方法
// 好處:覆蓋父類以前的做法
- (void)run
{
NSLog(@"Student跑起來了");
}
@end
int main( )
{
Student *s = [Student new];
// 這裏調用run方法時,會先去Student中去找,如果找不到就去父類中找,再找不到就去上一級中找
[s run];
return 0;
}
重寫:子類重新實現父類中的某個方法。 好處:覆蓋父類以前的做法
繼承的適用場合:
1. 當兩個類擁有相同屬性和方法的時候,就可以將相同的東西抽取出來放到一個父類中
2. 當A類完全擁有B類中的部分屬性和方法時,可以考慮讓B類繼承A類
super關鍵字:
舉一個植物大戰殭屍例子(殭屍:跳躍殭屍,舞王殭屍,鐵桶殭屍)
#import <Foundation/Foundation.h>
// ***********殭屍**************
@interface Zoombie : NSObject
- (void)walk;
+ (void)test;
- (void)test;
@end
@implementation Zoombie
+ (void)test
{
NSLog(@"Zoombie+test");
}
- (void)test
{
NSLog(@"Zoombie-test");
}
- (void)walk
{
NSLog(@"往前走兩步");
}
@end
// ***********跳躍殭屍***********
@interface JumpZoobie : Zoombie
+ (void)haha;
@end
@implementation JumpZoobie
// 跳也是走的一種方式,所以重寫父類的walk方法
- (void)walk
{
NSLog(@"往前跳一下");
//NSLog(@"往前走兩步");
[super walk]; // 調用父類的walk方法
}
+ (void)haha
{
// 調用父類的+test方法,因爲haha是一個類方法,所以這裏的super調用的是父類中的類方法+test
[super test];
}
@end
int main( )
{
JumpZoobie *jz = [JumpZoobie new];
[jz walk];
[JumpZoobie haha];
return 0;
}
super的作用:
1. 直接調用父類中的某個方法
2. 如果super處在對象方法中,那麼就調用父類中的對象方法
3. 如果super處在類方法中,那麼就調用父類中的類方法