——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
多态的概念:
不同的对象以自己的方式响应父类同名的方法,这就是多态。
体现:
父类的指针指向了子类的对象。
多态的条件:
1.有继承关系
2.有方法重写,即子类重写父类方法
多态最终的效果是父类可以引用子类的方法。
新建3个类:Animal, Dog, Cat. 其中Dog, Cat继承Animal类。
Animal类有一个run()方法:
#import "Animal.h"
@implementation Animal
-(void)run{
NSLog(@"animal is running.");
}
@end
Dog类也只有一个run()方法,不过其重写了父类Animal的run()方法:
#import "Dog.h"
@implementation Dog
-(void)run{
NSLog(@"dog rushed outof door with the 80 speed.");
}
@end
Cat类派生了一个新的方法welcome(), cat.h中代码:
#import "Animal.h"
@interface Cat : Animal
-(void)welcome;
@end
cat.m中代码:
#import "Cat.h"
@implementation Cat
-(void)run{
NSLog(@"cat is climbing the tree, so high,so high.");
}
-(void)welcome{
NSLog(@"cat is waiting its host.");
}
@end
main()函数中代码:
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *ani = [Animal new];
[ani run];
Dog *dog = [[Dog alloc]init];
[dog run];
Cat *cat = [[Cat alloc]init];
[cat run];
//***************多态写法*************************//
Animal *ani2 = [Dog new];
[ani2 run]; //此处调用的是Dog类重写的run方法,不是animal的run方法。
Animal *ani3 = [Cat new];
[ani3 run];
//不能直接调用父类不存在的方法、而在子类存在的方法。因为ani3在系统刚执行时认为其是一个Animal类,而Animal类没有Welcome这个方法,所以编译的时候发生错误。
//[ani welcome]; 这会报错
//可以进行强制转换,提前告诉系统这是一个Cat类。不过必须有多态的声明。
//Animal *ani3 = [Cat new]; //如果没有此句代码,执行时会错误
[(Cat *)ani3 welcome];
}
return 0;
}
最终输出结果如下: