- 我试了试视频的代码,然后我把传给feed的形參类型改成了NSObject,这从逻辑上是没问题的,因为他是animal的父类。编译只是提示 NSObject may not resopond ,但是运行结果正确。
2015年4月30日星期四
下午9:49
然后我改回来了。接着把animal的eat方法给去掉了,既然oc是动态识别传给feed的对象的类的,而且它调用的dog的方法,所以我删了它。我觉得可以正常运行的,一样的结果。结果提示-[Animal eat]:unrecognized selector sent to instance。大家不觉得奇怪吗?我不知道怎么理解这个现象。
#import<Foundation/Foundation.h>
@interface Animal:NSObject
@end
@implementation Animal
//eat被我删了
@end
@interface Dog:Animal
- (void)eat;
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog eat");
}
@end
@interface Cat:Animal
- (void)eat;
@end
@implementation Cat
- (void)eat
{
NSLog(@"Cat eat");
}
@end
void feed(Animal *a)
{
[a eat];
}
int main()
{
[[Animalnew] eat];
Dog*d=[Dog new];
feed(d);
return 0;
}
可以看到如果想要一个方法多态,父类必须要有该方法。![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
多态的定义
多态与泛型(generic)
多态实际上就是泛型。
所谓泛型就是指我们不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式,无论是数据结果还是算法。
传统的泛型是指类似以Template function的方式使参数一般化,典型的应用是C++ STL,比如List、Vector以及algorithm。
而OO已能通过接口(Interface)和抽象类(Abstract Class)进行真正意义上的泛型了。在我看来,这就是OO最精彩的地方,也就是多态的威力。而对于传统意义上的Generic,我始终觉得其作用已经今不如昔了。
我想这段话已经把多态说的很清楚了。多态就是通用代码却可以工作在不同的类上。
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------