- 基本概念:
继承的上层是:父类。继承的下层是:子类。
继承是单向的,不可以A继承B,B还继承A。
继承具有传递性,子类继承父类的的特征和行为。
子类扩展了父类,使特征和行为更加的具体。 - OC中的继承:
OC中的继承,即一个类继承自另一个类。
被继承的类成为父类或超类。
继承的类成为子类。 - 继承的特点:
OC中只允许单继承。
没有父类的类成为根类,OC中的根类是NSObject(祖宗类)。
继承自父类的内容:除了私有变量外的所有实例变量和方法。
子类可以重写父类的方法。 - 继承的传递性:
B类继承A类,C类继承B类,D类继承C类。然后,D类拥有C类、B类、A类三个类中除私有变量之外的所有实例变量和方法。 - 继承中方法的执行顺序:
a. 查找本类中是否实现了要执行的方法。
b. 如果没有,去父类中查找。
c. 逐级向上找,找到即执行。
d. 如果没有找到,则报错。 - super关键字:
描述:只是OC中的关键字,不是父类对象,只是用来调用父类中的方法。
作用:给super发消息,可以执行父类中实现的方法。
- 完整的初始化方法:
#pragma mark 完整的初始化方法
- (id)init
{
// 执行父类中的init方法 self = [super init]; if (self) { // 初始化设置 } // 返回初始化完成的对象 return self; }
- 初始化过程:
a. 执行父类中实现的初始化方法。(向上递归到NSObject类中的初始化方法)
b. 从根类NSObject开始执行初始化方法。
c. 判断父类中的初始化是否成功,即self是否存在。
d. 完成对象的初始化设置,返回对象。 - 灵活使用初始化方法,可以在初始化时候设置一些实例变量:
#pragma mark 灵活使用初始化方法
#pragma mark 初始化时设置学生姓名
- (id)initWithStudentName:(NSString *) name
{
self = [super init]; if (self) { _name = name; } return self; }
#pragma mark 初始化时设置学生姓名和学号
- (id)initWithStudentName:(NSString *)name withStuNum:(NSInteger)stuNum
{
self = [super init]; if (self) { _stuNum = stuNum; _name = name; } return self; }
- 声明和实现:
#pragma mark 声明便利构造器
+ (id)personWithName:(NSString *) name;
-
#pragma mark 实现便利构造器
+ (id)personWithName:(NSString *)name
{
Person *person = [[Person alloc] initWithName:name]; return person; }
- 使用便利构造器:
// 使用遍历构造器创建Person对象
Person *person = [Person personWithName:@"张三"];
- 特点:
便利构造器是类方法。
- 便利构造器命名规则:
使用驼峰命名法,方法名以类名开头。
- 什么是多态?
早上我和同事说口渴,想喝水。结果:A同事拿着我的杯子去给我接了一杯水。B同事顺手在饮水机上拿了一次性纸杯给我接了杯水。C同事给了我一瓶他早上刚买的饮料。同事得到的是同样地请求,但是三个人都有各自的解决办法,这就是多态。
多态就是不同对象在响应同一个请求时候不同的实现。父类指针可以指向子类对象。 - 实现:
定义Animal类,和它的子类,Cat、Dog类:
///Animal.h:
#import
@interface Animal : NSObject
#pragma mark 声明动物吃东西的方法
- (void)eat;
@end
///Animal.m: #import "Animal.h"
@implementation Animal
- (void)eat
{
NSLog(@"动物吃东西了"); }
@end
/// Cat.h:
#import "Animal.h"
@interface Cat : Animal
@end
/// Cat.m:
#import "Cat.h"
@implementation Cat
- (void)eat
{
NSLog(@"猫吃鱼"); }
@end
/// Dog.h:
#import "Animal.h"
@interface Dog : Animal
@end
/// Dog.m:
#import "Dog.h"
@implementation Dog
- (void)eat
{
NSLog(@"狗吃骨头"); }
@end
// 外部使用
Animal *animal = nil;
animal = [[Cat alloc] init];
[animal eat];
animal = [[Dog alloc] init];
[animal eat];
// 输出如下:
猫吃鱼
狗吃骨头
说明:
a. 初始化方法返回的是id类型,id是一个可以指向任何对象的指针。因此animal可以指向Cat和Dog类型的对象。
b. Cat类型对象和Dog类型对象在响应同一个方法eat中,做出了不同的反响,这正是多态的表现。
- 多态的特点:
a. 父类指针可以指向不同的子类对象
b. 允许在多个类中定义同一个消息接口
c. 可以屏蔽不同的子类之间的差异,可以通用代码
d. 适应需求的不同变化