继承
【注】面向对象语言的三大特性,继承性,封装性,多态性。
【注】这里说的继承,指集合的包含关系,即父类和子类的关系
一.认识继承
(一)从生活逻辑的角度
父类 生物 外星人 超级英雄
子类 动物 变形金刚 变种人
父类 动物 变形金刚 变种人
子类 人类 汽车人 欧米伽级变种人
类 人类 汽车人 欧米伽级变种人
对象 我 大黄蜂 凤凰女
【注】父子类的各种称呼
父类 parentClass 超类 supperClass 基类
子类 childClass 子类 subClass 派生类
【注】【继承】也可被称作【派生】。父类拥有的属性和方法,子类直接获得,这个过程叫做继承。子类在父类基础上,衍生出了自己独有的属性和方法,称为派生。继承和派生是描述同一事物的两种侧重。
(二)从编写代码的角度
@interface Father : NSObject
{
int a;
int b;
int c;
}
- (void)run;
- (void)jump;
@end
@interface Son : Father
//通过:建立继承关系 继承到父类的字段,属性和消息
//但是子类无法继承到父类未声明的方法
//子类也可以派生出自己独有的字段,属性和消息
{
int d;
}
- (void)swim;
@end
【重写】有时候从父类继承到的方法,并不适合子类,子类可以重写这个方法。
【重写是多态的一种,多态就是同一个声明不同的实现】
【注】很多时候,子类的方法只需要在父类的同名方法中增补些内容。可以通过关键字【supper】调用父类的方法,再增添子类独有的内容。
//重写父类的jump方法,重写方法,不用声明
//重写的方法会覆盖掉父类的方法
- (void)jump
{
NSLog(@"I can jump 1.8m!");
}
//很多时候,重写父类的方法,只是在父类的功能上添枝加叶。
- (void)showSelf
{
//先调用父类的showSelf,再加上自己的功能
[super showSelf];
NSLog(@"%@", self.ID);
}
(三)从内存结构的角度
【自己画图】
【问】为什么OC不能sizeof一个对象的大小或一个类的大小?和类结构相近的结构体却可以。
【再问】为什么OC不能将对象声明到静态空间,如栈中?和类结构相近的结构体却可以。
【答】因为OC的动态继承编译机制。所谓动态继承机制,就是说在编译时,不能确立类之间的继承关系,自然无法确定类的大小。只有运行时,才确立类之间的继承关系。不能在编译时确定类的大小,自然不能将类的对象创建在栈里。
二.继承的作用
编写面向对象的程序,核心的手法有三:
继承 封装 多态
(一)(iOS中用的最少)创建大量相似的类
【例】创建象棋中的棋子,车马士象炮。
可以先创建棋子类,作为父类。
(二)(最常用)继承一个官方或第三方类,添加属性和方法,创建一个更符合当前工程的新类。
【注】NSString NSArray NSDictionary 都是【工厂类】不能被继承,即使被继承,也不能使用父类的方法。
【注】因此经常听到人说,继承用于扩展类。
(三)(不常用到)用继承方式统一多态接口
【见下一节】
三.多态与类的消息机制
【多态】重写,虚函数
//其实多态就是指,同一个接口不同的实现。
【注】OC的成员方法采用消息机制,因此都是虚函数。
oc函数都是虚函数。
【虚方法】
1.父类的指针,可以指向子类的对象。
2.响应消息,不看指针,看对象。
【注】虚方法体现了不同事物被同一事件触发,有不同的响应。
【工厂类】
//狼 灰太狼
//羊 喜洋洋
//动物 灰太狼, 喜羊羊
:动物
NSString * str = @“123”;
NSString * str = [[NSString alloc] initUTF8String:];
【例】
殴打小动物
有三种小动物,猫,狗,蛤蟆
【分析项目<英汉字典>】
//数据
//对象:储存数据,管理数据
//对象储存管理:英汉词条对
//每个英汉词条对是一个对象。
//词条管理器,管理每个词条
—————
a:一个
—————
abc:某种退
烧药
—————