一起Talk IOS吧(第二十回 OC中的多态)

看官们,本章回中介绍面向对象中第三个主要内容:多态。

多态表示不同类型的对象收到相同的消息时表现出不同的效果。举一个常见的例子:天气预报说明天会下雪,农民们听到这个消息后很高兴,因为下雪有助于农作物生长;物流公司听到这个消息后就不高兴了,因为下雪影响物流运输。同样的消息到了不同人哪里引起了不同的效果,这便是多态。

多态比较抽象,只从文字上说明不好理解,接下来我们通过具体的代码来演示什么是多态。

[phone makeCall];  输出结果:Phone makeCall
[iPhone makeCall]; 输出结果:IPhone makeCall

这是我们从上一章回中拿出的部分代码,大家可以看到收到makeCall这个消息后两种不同类型的对象输出了不同的结果。这便是多态。

有看官说,不同类型的对象输出不同的结果,这个是正常的。这么说也对,这段代码理解起来比较容易,不过你可不要把多态想简单了,面向对象三个要素中多态最复杂。接下来我们展示一个有难度的代码:

Phone * temp = nil;

if([iPhone isKindOfClass:[Phone class]]) {
	temp = (Phone*)iPhone;
	[temp makeCall];
}else {
	NSLog(@"IPhone is not isKindsOfClass: Phone");
}

我们一起分析上面的代码,因为多态是建立在继承的基础上的,所以我们复用了上一章回的代码,只需要把上面的代码复制到上一章回中代码的main方法最后面就可以运行。

代码中定义了一个Phone类型的对象指针temp,并且初始化为空,然后把IPhone类型的对象强制转换成成Phone类型的对象并且赋值给temp,temp收到makeCall消息后输出什么结果呢?

小部分看官说:IPhone makeCall。大部分看官说:Phone makeCall。看来大家有分歧。我来告诉大家答案是:IPhone makeCall。

看来真理还是掌握在少数人手里呀。这里的原因是什么呢?我们这就给大家分析,temp虽然是Phone类型的对象,但是它真正的内容是IPhone对象的内容,因为它是从IPone对象转换来的。这可以看作是一种隐形的多态。

这里面涉及到了类型转换。子类对象可以转换成父类对象, 但是父类对象不能直接转换成子类对象,如果想让父类对象转换成子类对象,需要符合一定的前提条件:父类对象是通过子类的对象转换而来的,比如我们上面的代码就是一个例子。子类对象转换成父类对象后就可以通过父类对象访问子类中的方法,或者说相同的消息传递给子类对象对象和父类对象后会产生不同的效果,这也符合多态的思想。

最后,我们对本章回的内容做一个总结:

  • 1.多态表示不同对象收到相同消息时展示不同的形态;
  • 2.子类对象可以转换成父类对象,父类对象不能直接转换成子类对象;
  • 3.可以使用父类对象调用子类的方法,当然需要一定的前提条件:父类对象通过子类对象转换而来;

看官们,欲知后事如何且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值