——黑马程序员——OC中的多态
2015-11-06 10:53
435 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
OC中的多态
条件:
1、有继承关系
2、有方法重写
3、分类的声明变量指向子类对象(父类的指针指向子类的对象)
Animal *a = [Animal new];
Animal *a = [ Dgo new];
1、动态类型当程序直到执行时才能确定对象所属类型
2、动态类型绑定当程序直到执行时才确定要对对象调用的方法
3、动态绑定可以在运行时加入新的数据类型和新的程序模块:动态识别、动态绑定、动态加载
4、id类型:通用指针类型,又称万能指针,弱类型,编译时不进行类型检查
#import <Foundation/Foundation.h>
//定义Animal类
@interface Animal:NSObject
-(void)run;
@end
@implementation Animal
-(void)run{
NSLog(@"动物正在跑");
}
@end
//定义Dog类
@interface Dog: Animal
@end
@implementation Dog
//重写run方法
-(void)run{
NSLog(@"狗正在迅速的奔跑!");
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//创建对象
Animal *a = [Animal new];
//调用run方法
[a run];
//创建dog类
Dog *d = [Dog new];
//调用run方法
[d run];
//***********使用多态时************
//创建对象
Animal *a2 = [Dog new];
// 调用方法
[a2 run];
[pool drain];
return 0;
}
2、可以在一个函数中考虑到所有可能的对象
2、如果不存在多态,父类不能访问子类特有的方法
//
// main.m
// 多态
//
// Created by YuHongpeng on 15/11/8.
// Copyright (c) 2015年 YuHongpeng. All rights reserved.
//
#import <Foundation/Foundation.h>
//定义Animal类
@interface Animal:NSObject
-(void)run;
@end
@implementation Animal
-(void)run{
NSLog(@"动物正在跑");
}
@end
//定义Dog类
@interface Dog: Animal
//此方法Animal中没有
-(void)eat;
@end
@implementation Dog
//重写run方法
-(void)run{
NSLog(@"狗正在迅速的奔跑!");
}
//此方法Animal中没有
-(void)eat{
NSLog(@"狗正在吃东西!**");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
//————使用多态时注意————
//通过父类调用子类中有而父类中没有方法
Animal *a3 = [Dog new];
[(Dog *)a3 eat];
NSLog(@"Hello, World!");
}
return 0;
}
以下是的写法会报错
OC中的多态
一、概念
多态:某一种事物的多种形态,在程序中指的是不同对象以自己的方式响应相同名称方法的能力条件:
1、有继承关系
2、有方法重写
3、分类的声明变量指向子类对象(父类的指针指向子类的对象)
Animal *a = [Animal new];
Animal *a = [ Dgo new];
二、原理
动态绑定1、动态类型当程序直到执行时才能确定对象所属类型
2、动态类型绑定当程序直到执行时才确定要对对象调用的方法
3、动态绑定可以在运行时加入新的数据类型和新的程序模块:动态识别、动态绑定、动态加载
4、id类型:通用指针类型,又称万能指针,弱类型,编译时不进行类型检查
#import <Foundation/Foundation.h>
//定义Animal类
@interface Animal:NSObject
-(void)run;
@end
@implementation Animal
-(void)run{
NSLog(@"动物正在跑");
}
@end
//定义Dog类
@interface Dog: Animal
@end
@implementation Dog
//重写run方法
-(void)run{
NSLog(@"狗正在迅速的奔跑!");
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//创建对象
Animal *a = [Animal new];
//调用run方法
[a run];
//创建dog类
Dog *d = [Dog new];
//调用run方法
[d run];
//***********使用多态时************
//创建对象
Animal *a2 = [Dog new];
// 调用方法
[a2 run];
[pool drain];
return 0;
}
三、多态特点
1、简化接口,允许在类和类之间重用一些习惯性的命名2、可以在一个函数中考虑到所有可能的对象
四、多态的注意点
1、如果存在多态,父类是可以访问子类特有的方法2、如果不存在多态,父类不能访问子类特有的方法
//
// main.m
// 多态
//
// Created by YuHongpeng on 15/11/8.
// Copyright (c) 2015年 YuHongpeng. All rights reserved.
//
#import <Foundation/Foundation.h>
//定义Animal类
@interface Animal:NSObject
-(void)run;
@end
@implementation Animal
-(void)run{
NSLog(@"动物正在跑");
}
@end
//定义Dog类
@interface Dog: Animal
//此方法Animal中没有
-(void)eat;
@end
@implementation Dog
//重写run方法
-(void)run{
NSLog(@"狗正在迅速的奔跑!");
}
//此方法Animal中没有
-(void)eat{
NSLog(@"狗正在吃东西!**");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
//————使用多态时注意————
//通过父类调用子类中有而父类中没有方法
Animal *a3 = [Dog new];
[(Dog *)a3 eat];
NSLog(@"Hello, World!");
}
return 0;
}
以下是的写法会报错
相关文章推荐
- 程序员的教师节
- 黑马程序员---自学随堂笔记----String的一些知识点
- 面试中五个咸鱼翻身的机会,好好把握!
- 黑马程序员---自学随堂笔记----线程
- 递归调用的题目-腾讯面试题
- 黑马程序员-----IO(一)
- 程序员常去的网站
- 黑马程序员---自学随堂笔记----包
- 2016 校招, Android 开发,一个本科应届的坎坷求职之路(转)
- 这些 iOS 面试基础题目,你都深入了解吗?
- 黑马程序员---自学随堂笔记----异常
- ——黑马程序员——OC中的私有变量、私有方法、descriptiion方法
- 黑马程序员-Java I/O流(二)-File类、Properties类、打印流、序列流(合并流)
- Java 线程面试问题
- SOA面试题
- 小米面试题 计算朋友圈问题
- Java程序员面试中的多线程问题
- 面试经历---铂涛集团(2015年10月17日下午)
- 一个优秀的Java程序员必须了解的GC机制
- [非凡程序员]观察者模式