Objective-c-多态

本文介绍了Objective-C中的继承和多态概念,并通过具体的示例解释了如何使用父类对象承载子类对象,以及如何实现方法重写。同时探讨了动态类型id的特性及其在运行时类型检查的应用。

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

在OC中也有继承和多态,比如说一个子类去继承一个父类,我们假设子类是Square,父类是Shape,我们的子类能继承父类的变量属性和行为,就是父类的指针可以直接指向他的子类比如说以下的写法是可以的。
 Square *square=[[Square alloc]init];
    Shape * shape=square;
NSLog("@"%d",[shape area]);

因为在Square子类中有area这个方法而且还是重写了父类的area的方法所以调用的是area的这个方法,就是用父类对象去承载一个子类对象,在运行的适合能够区分出来的。多态必须要相同的方法,如果说我们有个Circle类,如果我们让这个类继承了Shape这个类,我们重新写了个-(double)area方法,而之前的area的方法是-(int)area,如果让父类的指针去指向Circle类的对象去调用area的方法的话只会调用父类的方法.

OC中的id其实就是void * 可以代表任何一类的指针,定义一个对象可以这么定义。

id s=[[Square alloc]init];
NSLog(@"%d",[s area]);//会报错
为什么第二个语句会报错呢?因为id本身是一个动态类型,在刚开始定义的时候确定不了,只有在运行的时候才能确定。存储在id里面的变量因为在编译时无法确定其的类型,要到运行时才能检查。而编译时就能确定的类型就是比如我们之间定义的一个Shape类型,是在定义时就能确定的。将一个变量定义为特定的类型的对象的时候用的就是静态形式。
NSObject支持的三种基本的方法

-(BOOL)isKindOf:class-object(判断对象是否是class-object或其子类的成员)

-(BOOL)isMemberOfClass:class-object(只能判断对象是不是class-object的成员)

-(BOOL)respondsToSelector:selector(判断对象是否能够响应selector所指定的方法)

id str=[[Square alloc]init];
BOOL a=[str isKindOfClass:[Square class]];//此处a是YES

id str=[[Square alloc]init];
BOOL a=[str isKindOfClass:[Shape class]];//此处a也为YES

id str=[[Square alloc]init];
BOOL a=[str isMemberOfClass:[Shape class]];//此处a为NO

id str=[[Square alloc]init];
BOOL a=[str isMemberOfClass:[Square class]];//此处a为YES

//SEL也是OC中的一种类型它是指向函数的一个指针,用它来标识一函数的地址

SEL sel=@selector(area)//此处sel是保存所以名称为area函数的地址
BOOL a=[str respondsToSelector:sel];//此处为YES
[str performSelector:sel];//此处str可以运行area函数,这里是去调用这个消息,不应该去处理它的一个返回值



















































                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值