Objective-C之多态

本文介绍了Objective-C中的多态概念,强调了多态依赖于继承,并通过实例展示了如何在代码中体现多态。文章提醒在使用多态时要注意,如果父类中没有子类特有的方法,编译器会报错。为解决此问题,可以采用强制类型转换。最后,总结了多态的局限性,即父类引用不能直接调用子类独有的方法,需要强制转换。

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

一.基本概念:

    1.多态在代码中的体现,即为多种形态,一定要有继承,没有继承就没有多态。

    2.在使用多态时,运行时会进行动态检测,向真实的对象发送信息(方法)

    

    体现:多态在代码中:父类指针 指向 子类对象。



二.例子:

    动物类:

#import<Foundation/Foundation.h>
@interface Animal : NSObject

-(void)eat;
@end
#import "Animal.h"
@implementation Animal

-(void)eat{
 NSLog(@"动物吃东西");
}
@end

狗类:

#import "Animal.h"
@interface Dog : Animal

-(void)eat;
@end
#import "Dog.h"
@implementation Dog

-(void)eat{
 NSLog(@"狗吃东西");
}
@end


二、使用注意

    多态的局限性:父类类型的指针变量不能直接调用子类特有的方法

    

      原因:

    1.当使用多态方式调用方法时,编译器首先检查父类中是否有该方法,如果有,运行的时候,确定类型,调用该类型的同名方法;如果父类没有该方法,运行时是无法指向子类的方法的,所以编译直接报错。    

    2.多态,是程序跑起来才决定是什么类型的.

    

    建议的做法:

Animal *a=[[Dog alloc] init];

[a run];//在Animal类中没有run方法,这里调用了狗对象的方法。

解决方法:可以将a强制转换为Dog*类型的变量,如下:

Dog *d=(Dog *)a;//使用强制转换,这里a和d指向的是同一个狗对象



 isKindOfClass:确定一个对象是否是该类的实例,或者是该类子类的实例.


三、多态使用总结



(1)没有继承就没有多态


(2)代码的体现:父类类型的指针指向子类对象


(3)好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

void feed(Animal *a){
//前提父类一定要有这个方法,如果没有报错。
[a eat];

}

(4)局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

    编译看左边,运行看右边。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值