本文主要是介绍一起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.可以使用父类对象调用子类的方法,当然需要一定的前提条件:父类对象通过子类对象转换而来;
看官们,欲知后事如何且听下回分解!
这篇关于一起Talk IOS吧(第二十回 OC中的多态)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!