-----------android培訓、java培訓、java學習型技術博客、期待與您交流!-----------
OC中的繼承
一、繼承概念
繼承:子類(派生類)擁有了父類同樣的方法和屬性(實例變量)過程,繼承是指類和類之間的關係,子類可以對父類的行爲進行擴展、覆蓋和重定義
二、繼承的優點:
1、省去大量的代碼
2、使類和類之間建立起了聯繫
例如:
//動物繼承NSObject 類
@interface Animal: NSObject
{
}
-(void) run;
@end
//類的實現
@implementation Animal
-(void) run{
NSLog(@"狗正在跑");
}
@end
//創建狗的類
@interface Dog:Ainmal
-(void)lookhome;
@
//狗類的實現@implementation Dog
-(void)lookhome{
NSLog(@"狗正在瞪着眼睛看家");
}
@end
#import <Foundation/Foundation.h>
//動物繼承NSObject 類
@interface Animal: NSObject
{
}
-(void) run;
@end
//類的實現
@implementation Animal
-(void) run{
NSLog(@"動物正在跑");
}
@end
//創建狗的類
@interface Dog: Animal
-(void)lookhome;
@end
//狗類的實現
@implementation Dog
-(void)lookhome{
NSLog(@"狗正在瞪着眼睛看家");
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//匿名類調用方法
[[Animal new] run ];
[[Dog new] lookhome ];
//創鍵對象
Dog *d = [Dog new];
//讓Dog調用run的方法
[d run];
[pool drain];
return 0;
}
<span style="font-size:14px;">#import <Foundation/Foundation.h>
//動物繼承NSObject 類
@interface Animal: NSObject
{
NSString * _name;
int _age;
}
//定義set get方法
-(void)setName:(NSString *) name;
-(void)setAge:(int) age;
-(NSString *)name;
-(int)age;
//定義run方法
-(void) run;
@end
//類的實現
@implementation Animal
//set get方法的實現
-(void)setName:(NSString *) name{
_name = name;
}
-(void)setAge:(int) age{
_age = age;
}
-(NSString *)name{
return _name;
}
-(int)age{
return _age;
}
-(void) run{
NSLog(@"動物歲正在跑");
}
@end
//創建狗的類
@interface Dog: Animal
-(void)lookhome;
@end
//狗類的實現
@implementation Dog
-(void)lookhome{
NSLog(@"狗正在瞪着眼睛看家");
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[[Dog new] lookhome ];
//創鍵對象
Animal *a = [Animal new];
Dog *d = [Dog new];
//用set方法給動物實例變量賦值
[a setName: @"脊椎動物"];
[a setAge: 100];
NSLog(@"%@%d歲",[a name],[a age]);
//調用方法
[a run];
//給狗設置名稱和年齡 狗類本身沒喲實力變量_name,_age,因爲Dog繼承了父類,父類有
[d setName: @"小黃"];
[d setAge: 5];
//讓d調用run的方法
NSLog(@"這個狗叫%@今年%d歲", [d name], [d age]);
[d run];
[pool drain];
return 0;
}</span>
三、基類和派生類之間的關係
1、派生類不但擁有基類的方法和屬性,還可以自己增加屬性和方法
2、基類的私有屬性能被繼承但是不能被訪問
3、OC中的繼承是單一繼承,一個類只能繼承一個父類
4、要注意繼承的合理性,只有一類的可以繼承
四、方法的重寫(重點)
#import <Foundation/Foundation.h>
//動物繼承NSObject 類
@interface Animal: NSObject
{
NSString * _name;
int _age;
}
//定義set get方法
-(void)setName:(NSString *) name;
-(void)setAge:(int) age;
-(NSString *)name;
-(int)age;
//定義run方法
-(void) run;
@end
//類的實現
@implementation Animal
//set get方法的實現
-(void)setName:(NSString *) name{
_name = name;
}
-(void)setAge:(int) age{
_age = age;
}
-(NSString *)name{
return _name;
}
-(int)age{
return _age;
}
-(void) run{
NSLog(@"動物正在跑");
}
@end
//創建狗的類
@interface Dog: Animal
-(void)lookhome;
@end
//狗類的實現
@implementation Dog
-(void)lookhome{
NSLog(@"狗正在瞪着眼睛看家");
}
<strong><span style="color:#ff0000;">//重寫父類Animal的方法,
-(void) run{
NSLog(@"狗正在跑");</span></strong>
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[[Dog new] lookhome ];
//創鍵對象
Animal *a = [Animal new];
Dog *d = [Dog new];
//用set方法給動物實例變量賦值
[a setName: @"脊椎動物"];
[a setAge: 100];
NSLog(@"%@%d歲",[a name],[a age]);
//調用方法
[a run];
//給狗設置名稱和年齡 狗類本身沒喲實力變量_name,_age,因爲Dog繼承了父類,父類有
[d setName: @"小黃"];
[d setAge: 5];
//讓d調用run的方法
NSLog(@"這個狗叫%@今年%d歲", [d name], [d age]);
//當dog類調用run 時 顯示的是動物在跑,我們想要讓他顯示狗再跑,因此就需要方法重寫
[d run];
[pool drain];
return 0;
}
五、繼承使用的注意事項
1、子類不能定義和父類同名的變量,因爲子類已經繼承了基類的屬性和方法,相同時程序報錯,
2、OC中只能單一繼承,不支持多繼承
3、OC中支持多層繼承