黑马程序员_Objective-C语言_继承和多态

本文详细介绍了Objective-C中的继承和多态概念。继承允许子类从父类继承属性和方法,并能添加自己的特性。Objective-C支持单继承,不支持多继承。多态则是不同对象对同名方法的不同响应,需要有继承关系和方法重写。类的本质包括类类型的变量、类对象及其获取方式。类对象包含类的基本信息,可以创建实例并调用类方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1、继承

    就拿交通工具来说,交通工具分为汽车类和飞机类,而汽车又有小汽车,卡车,飞机由民航飞机和战斗机。

    那交通工具就是基类也就是父类,汽车和飞机是交通工具 的派生类,要有满足交通工具的特性,又有自己的功能。

如何继承:

A导入要继承的那个类的文件

B子类名:后跟父类名

实例:动物的继承

1.定义父类动物类,派生类dog类,dog类又派生的JunDog类

//动物声明
@interface Animal :NSObject
{
	@public
	int _age;
}
//吃
-(void)eat:(NSString *)foodName;
@end

//dog声明,继承动物这个类
@interface Dog :Animal
//看家
-(void)lookHome;
@end

//JunDog声明,继承Dog这个类
@interface JunDog :Dog
//炸碉堡
- (void)zhaDiaoBao;
@end

2 .实现父类动物类,派生类dog类,dog类又派生的JunDog类

//动物类实现
@implementation Animal
- (void)setIpadName : (NSString *)ipadName{
	_ipadName = ipadName;
}

-(void)eat : (NSString *)foodName{
	NSLog(@"正在吃%@", foodName);
}
@end

//dog类实现
@implementation Dog
-(void)lookHome{
	NSLog(@"正在紧急状态");
}
@end

//JunDog类实现
@implementation JunDog
- (void)zhaDiaoBao{
	NSLog(@"军犬炸碉堡");
}
@end

3.测试调用

Animal *animal = [Animal new];
	animal->age = 2;
	[animal eat:@"骨头"];
	Dog *dog = [Dog new];
	[dog eat : @"小骨头"];
	[dog lookHome];
	JunDog *jundog = [JunDog new];
	[JunDog eat : @"军犬小骨头"];
	[JunDog lookHome];
	[JunDog zhaDiaoBao];
分析:虽然没有在dog和JunDog类声明吃的方法,但都可以输出,也没有在JunDog类声明看家的方法,照样也能输出。是因为虽然表面上没有定义,但是由于它们是继承关系,自然而然的就把父类的属性和方法给继承到自身中了。
2、基类和派生类之间的关系

可以用下图表示


派生类方法属性=基类方法属性+派生类自己新增的方法和属性

注意:

  1. 基类的私有属性能被继承,不能被使用
  2. OC中的继承是单继承,也就是一个类只能有一个父类,不能继承多个父类
  3. 继承的合理性

方法的重写:在父类中的方法在派生类中重新写一次。

先查找当前类有没有eat方法,如果有,先调用自己的,如果没有,则查看父类有没有,父类有则执行父类的,如果还没有,在看看爷爷辈的有没有,有就执行爷爷辈的,没有继续往上找。

注意事项:

  1. 子类不能定义和父类同名的变量,但是可以继承父类的变量
  2. OC类支持单一继承,不支持多继承
  3. OC支持多层继承

2、多态

父类不能访问子类方法,到目前为止,要想实现,可以通过多态

多态是指某一类事物的多种形态。程序中的多态:不同的对象以自己的方式响应相同名称方法的能力。

多态的条件(重点):有继承关系、有方法重写(子类把父类的同名方法重写);父类的声明变量指向子类对象。

代码体现:用父类类型的指针指向了子类对象

狗 *g=[狗 new];

动物 *a=[狗 new];


猫 *g=[猫 new];

动物 *a=[猫 new];

优点:简化了编程接口,容许在类和类之间重用一些习惯性的命名,不用试图在一个函数中考虑到所有可能的对象。

多态原理:

  1. 动态绑定,动态类型能够使程序直到执行时才确定对象所属类型
  2. 动态类型绑定能够使程序直到执行时所确定要对对象调用的实际方法
  3. OC不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块,动态类型识别,动态绑定,动态加载
  4. ID类型:通用指针类型,弱类型,编译时不进行类型检查

多态注意点:

如果存在多态,父类可以访问子类特有的方法,要有强制转换。

3、类的本质

A 类类型的变量(实例对象)

Person *p=[Person new];

过程:把类的代码加载到代码区,产生一个类对象,类型是Class;isa指向代码区的Person类。

实例化对象做的事情:申请空间  初始化   返回地址;对象isa指向类对象

B类的本质:也是一个对象(类对象)

类对象:

  • 类对象再程序运行时一直存在
  • 类对象是一直数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等
  • 类对象所保存的信息在程序编译时确定,在第一次使用该类的时候被加载到内存中
  • 类对象代表类,class代表类对象,类方法属于类对象
  • 如果消息的接收者是类名,则类名代表类对象
  • 运行时,所有类的实例都由类对象生成,类对象会把实例的isa的值修改成自己的地址,每个实例的isa都指向该实例的类对象
  • 从类对象里可以知道父类信息、可以响应的方法等
  • 类对象只能使用类方法,不能用实例方法

C类对象的获取方式

A 通过实例对象获取

Person *p=[Person new];

Class b=[p Class];//b就是Person类对象

B 通过类名获取(类名其实就是对象)

Class b=[Person Class];

类对象的使用(使用类名可以做):创建对象[Person new];调用类方法[Person run];

获取类对象Class b=[Person Class];使用类对象创建实例对象Person *p1=[b new];[p1 run];对象创建成功,b当Person来用的。使用类对象调用类方法[b run];


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值