一、继承
1. 为什么要使用继承呢?
1)先看一个例子:
声明一个Person类
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age; // 年龄
int _height; // 身高
NSString *_name; // 姓名
}
// 声明set方法和get方法
- (void)setAge:(int)age;
- (int)age;
- (void)setHeight:(int)height;
- (int)height;
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
@implementation Person
//set方法和get方法的实现
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)setHeight:(int)height
{
_height = height;
}
- (int)height
{
return _height;
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
@end
定义一个学生类:
@interface Student : Person
{
int _no; // 学号
}
- (void)setNo:(int)no;
- (int)no;
@end
@implementation Student
- (void)setNo:(int)no
{
_no = no;
}
- (int)no
{
return _no;
}
@end
在Person类中定义了_age, _height, _name 三个成员变量,而Student类中定义了_no成员变量。但实际上在Student类中也有_age, _height, _name成员变量,这是因为Student继承了Person类,那么Student就拥有了父类Person的全部功能。那么这个继承是怎么实现的呢?
在C++和Java中继承都是通过关键字来实现,而Objective-C中继承以 “ :”标记 。如Person类中 开头
@interface Person :NSObject
@end
这行程序声明了Person继承了NSObject类,NSObject类是最基本的类,也就是说所有的类都继承这个类,同理第二段程序中Student类继承了Person类,从而Student就有了Person类的成员变量和方法。通过继承这一功能就给程序员编写程序带来很多好处:
--> 不改变原来模型的基础上,拓充方法
--> 建立了类与类之间的联系
--> 减少了工作量,使程序简介不重复累赘
2)继承的使用场合:
--> 当定义一个类时,这个类要使用另一个类的大部分属性和方法,一般用继承。
3)继承的注意事项:
--> 父类必须声明在子类前面
--> 子类不能拥有和父类相同的成员变量
--> 调用某个方法时,优先去当前的类中找,如果找不到,去父类中找
坏处:耦合性太强
4) 继承和组合
--> 继承: xxx 是 xxx
--> 组合: xxx 拥有 xxx
2. super关键字
super的作用:
--> 直接调用父类中的某个方法
--> super处在对象方法中,那么就会调用父类的对象方法
--> super处在类方法中,那么就会调用父类的类方法。
3.重写:
当子类对父类的某一方法的功能需求不满意时,可以对该方法的功能重新定义,这种方式就是重写。重写时不得改变该方法在父类中的声明,方法名不变,只需 在当前类中改变方法的功能。重写方法后,当程序在调用该方法时直接调用子类的方法,不再调用父类中对应的该方法。
二、多态
多态是指某一类事物的多种形态,多态以继承为前提,没有继承,如果没有继承,多态就无从谈起。
int main()
{
Animal *aa = [Dog new]; // 父类指针指向子类对象
Dog *dd = (Dog *)aa; // 将父类型强转为子类型
return 0;
}
该段程序就是多态的运用(Animal类和Dog类的定义略),Dog类继承了父类,同过[Dog new]来创建了一个Dog对象,然后定义以个Animal类型的指针 *aa指向了该Dog对象,也就是所谓的父类指针指向子类对象,这就是多态。
试想一下:为什么要引入多态这个概念呢?
如果当函数中或者方法中使用的是父类的类型,这时多态的特性就体现了。
但是多态有局限性,它不能直接调用子类特有的方法。需要调用子类特有的方法时,必须要强制转换成子类类型变量。