继承
什么是继承?
继承是指这样一种能力,它可以使用现有类的所有功能,并在无需重新编写原来的类的情下对这些功能进行扩展。
继承概念的实现方式的三类:
实现继承:实现继承是指使用基类的属性和方法而无需额外编码的能力;
接口继承:是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
可视继承:是指子窗体(类)使用基窗体(类)的外观和实现代码的能力;
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; // 报错
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>>抽取重复的代码
2>>建立类之间的关系
3>>子类可以访问父类的成员变量。而且可以调用父类中的方法
2>注意:
1>>基本上所有的类的根类都是NSObject
2>>子类重写父类的方法后,会把父类的方法给盖掉
3>>调用某个方法时,优先调用当前类中的该方法,如果没有该方法,那么就去父类中找
4>>父类的声明必须在子类之前
5>>子类不能声明跟父类同名的成员变量
3>继承的坏处:耦合性太强
4>继承的使用场合:
1>>当两个类拥有相同的属性和方法时,就可以把它们的共同点抽取到一个父类当中
2>>当A类完全拥有B类中的部分属性和方法时,可以让B类继承A类
5>不合适的使用场合:不符合我们逻辑思维,不合理的说法时不能用
// 组合: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(@"调用set成功%d",_age);
}
- (void)age
{
NSLog(@"调用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