——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
多态指的是: 同一种行为,对于不同的事物具有不同的表现形式。 这就叫做多态。
程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态
多态的条件:有继承关系、有方法重写
父类的声明变量指向子类对象。
实现:
Animal.h
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)eat;
@end
Animal.m
#import "Animal.h"
@implementation Animal
-(void)eat{
NSLog(@"动物在吃东西");
}
@end
Dog.h
#import "Animal.h"
@interface Dog : Animal
-(void)jump;
@end
Dog.m
#import "Dog.h"
@implementation Dog
-(void)eat{
NSLog(@"狗在吃东西");
}
-(void)jump{
NSLog(@"狗急了,在乱跳");
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *a = [Dog new];
[a eat];
//此处如果不强行将a转换成Dog类型,会报错。Animal没jump方法
[(Dog *)a jump];
}
return 0;
}
运行结果:狗在吃东西
狗急了,在乱跳
以上小知识点:多态情况下,对象调用父类中不存在的方法时(即子类新增的方法),在编译过程中报错。需要将该对象进行类型转换为子类类型,才可正常运行。
id是一种通用的对象类型,他可以用来存储任何类的对象。也可以理解为万能指针。
id的定义中已经包含了*号, 指针定义变量时,不需要再加* 号。
id和instancetype的区别
ios5之后推出了instancetype类型,与id类型相比:
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量
3)instancetype对比id的好处
* 能精确地限制返回值的具体类型
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
id obj = [Dog new];
[obj eat];
}
return 0;
}
运行结果: 狗在吃东西