繼承
什么是繼承厕诡?
繼承是指這樣一種能力,它可以使用現(xiàn)有類的所有功能营勤,并在無需重新編寫原來的類的情下對(duì)這些功能進(jìn)行擴(kuò)展灵嫌。
繼承概念的實(shí)現(xiàn)方式的三類:
實(shí)現(xiàn)繼承:實(shí)現(xiàn)繼承是指使用基類的屬性和方法而無需額外編碼的能力;
接口繼承:是指僅使用屬性和方法的名稱葛作、但是子類必須提供實(shí)現(xiàn)的能力寿羞;
可視繼承:是指子窗體(類)使用基窗體(類)的外觀和實(shí)現(xiàn)代碼的能力;
main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
#import "Animal.h"
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
//? Dog *dog = [Dog new];
//? Animal *dog = [Dog new];
Animal *dog = [Animal new];
[Dog setAge:50];
//? Student *s = [Student new];
//? Persen *s = [Student new];
Persen *s = [Person new];
[s run];
return 0;
}
Dog.h
#import <Foundation/Foundation.h>
#import "Animal.h"
//? @interface 類名 : 父類名
@interface Dog : Animal
{
//? int _age;? //? 報(bào)錯(cuò)
int _b;
}
@end
Dog.m
#import "Dog.h"
@implementation Dog
@end
Cat.h
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Cat : Animal
@end
Cat.m
#import "Cat.h"
@implementation Cat
@end
/*
繼承:
1>繼承的好處:
1>>抽取重復(fù)的代碼
2>>建立類之間的關(guān)系
3>>子類可以訪問父類的成員變量赂蠢。而且可以調(diào)用父類中的方法
2>注意:
1>>基本上所有的類的根類都是NSObject
2>>子類重寫父類的方法后绪穆,會(huì)把父類的方法給蓋掉
3>>調(diào)用某個(gè)方法時(shí),優(yōu)先調(diào)用當(dāng)前類中的該方法虱岂,如果沒有該方法玖院,那么就去父類中找
4>>父類的聲明必須在子類之前
5>>子類不能聲明跟父類同名的成員變量
3>繼承的壞處:耦合性太強(qiáng)
4>繼承的使用場(chǎng)合:
1>>當(dāng)兩個(gè)類擁有相同的屬性和方法時(shí),就可以把它們的共同點(diǎn)抽取到一個(gè)父類當(dāng)中
2>>當(dāng)A類完全擁有B類中的部分屬性和方法時(shí)第岖,可以讓B類繼承A類
5>不合適的使用場(chǎng)合:不符合我們邏輯思維难菌,不合理的說法時(shí)不能用
//? 組合:A擁有B
//? 繼承:B是A
類A(人)
{
int _age;
int _weight;
}
類B(狗)
{
//? int _age;
//? int _weight;
A *a;
int _hieght;
}
*/
Animal.h
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
int _weight;
}
- (void)setAge:(int)age;
- (void)age;
- (void)setWeight:(int)weight;
- (void)weight;
@end
Animal.m
#import "Animal.h"
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
NSLog(@"調(diào)用set成功%d",_age);
}
- (void)age
{
NSLog(@"調(diào)用get成功%d");
return _age;
}
- (void)setWeight:(int)weight
{
_weight = weight;
}
- (void)weight
{
return _weight;
}
@end
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age;
- (void)run;
@end
Person.m
#import "Person.h"
@implementation Person
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)run
{
NSLog(@"123");
}
@end
Student.h
#import "Person.h"
@interface Student : Person
@end
Student.m
#import "Student.h"
@implementation Person
- (void)run
{
//? NSLog(@"123");
NSLog(@"321");
}
@end