黑马程序员技术交流社区

标题: 复习第四天,总结下多态 [打印本页]

作者: SailY    时间: 2014-9-13 21:37
标题: 复习第四天,总结下多态
接着上次继续传吧,方便大家交流。

多态:不同对象对同一消息的不同响应,子类可以重写父类的方法,多态就是允许方法重名,参数或返回值可以是父类型传入或返回。

父类指针指向子类,或者说子类对象动态指向父类的现象叫多态,或者说允许将子类类型的指针赋值给父类类型的指针。
或者通俗理解为:
狗以Dog形态存在,也可以以Animal这种父类形态存在,即多种状态存在。

@interface Animal : NSObject
@end
@interface Dog : Animal
@end

int main()
{
    Dog *d = [Dog new];
    Animal *a = [Dog new];
   //  Dog *d = [Animal new]; 不会报错,但是有警告,不合理(可能Animal有“飞”这个动作,但是狗没有),oc是弱语法,左边怎么写都不报错
}

指针 a 虽然是 Animal 类型存在,但实际上 a 指向的对象是Dog类型,比如 [a eat]; 会首先到 Dog这个类里面找eat这个方法

好处:
1. 如果参数中使用的是父类类型,则父类、子类对象都可以传入,一个父类指针指向多种子类对象。例如Dog类和Cat类都是Animal类的子类,现在有个feed方法,参数类型是Animal类型,Dog类和Cat类都可以调用,狗吃狗粮,猫吃猫粮。

局限性:
父类类型的变量不能用来调用子类的方法。有警告。
例如:Animal *a = [Dog new];  
    [a run];
Animal父类里没有run方法,只有Dog子类里有run方法。
(这个地方感觉写的有点不清楚,过两天再修改把)
解决办法:强制转换
Dog *dd = (Dog *)a;



作者: 李东东    时间: 2014-9-14 07:21
这么厉害考过了吗   ?                                 
作者: zhuiyi007    时间: 2014-9-14 10:34
楼主一定要坚持下来,每天总结,才能有大的收获
作者: ‍___________H    时间: 2014-9-14 11:21
调用方法不是会检测对象的真实形象么,为什么不能运行[a run];
作者: SailY    时间: 2014-9-14 16:08
李东东 发表于 2014-9-14 07:21
这么厉害考过了吗   ?

还在总结博客中
作者: SailY    时间: 2014-9-14 16:10
zhuiyi007 发表于 2014-9-14 10:34
楼主一定要坚持下来,每天总结,才能有大的收获

确实,笔记、总结很重要
作者: SailY    时间: 2014-9-14 16:12
zhuiyi007 发表于 2014-9-14 10:34
楼主一定要坚持下来,每天总结,才能有大的收获

确实,笔记、总结很重要




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2