【学习笔记】【OC语言】多态

1.多态的基本概念
某一类事物的多种形态
OC对象具有多态性

2.多态的体现
Person *p = [Student new];
p->age = 100;
[p walk];
子类对象赋值给父类指针
父类指针访问对应的属性和方法

3.多态的好处
用父类接收参数,节省代码

4.多态的局限性
不能访问子类的属性(可以考虑强制转换)

5.多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法

6.代码

  1 #import <Foundation/Foundation.h>
  2
  3 /*
  4  多态
  5  1.没有继承就没有多态
  6  2.代码的体现:父类类型的指针指向子类对象
  7  3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
  8  4.局限性:
  9  1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法
 10  */
 11
 12 // 动物
 13 @interface Animal : NSObject
 14 - (void)eat;
 15 @end
 16
 17 @implementation Animal
 18 - (void)eat
 19 {
 20     NSLog(@"Animal-吃东西----");
 21 }
 22 @end
 23
 24 // 狗
 25 @interface Dog : Animal
 26 - (void)run;
 27 @end
 28
 29 @implementation  Dog
 30 - (void)run
 31 {
 32     NSLog(@"Dog---跑起来");
 33 }
 34 - (void)eat
 35 {
 36     NSLog(@"Dog-吃东西----");
 37 }
 38 @end
 39
 40 // 猫
 41 @interface Cat : Animal
 42
 43 @end
 44
 45 @implementation Cat
 46 - (void)eat
 47 {
 48     NSLog(@"Cat-吃东西----");
 49 }
 50 @end
 51
 52 // 这个函数是专门用来喂动画
 53 //void feed(Dog *d)
 54 //{
 55 //    [d eat];
 56 //}
 57 //
 58 //void feed2(Cat *c)
 59 //{
 60 //    [c eat];
 61 //}
 62 //
 63
 64 // 如果参数中使用的是父类类型,可以传入父类、子类对象
 65 void feed(Animal *a)
 66 {
 67     [a eat];
 68 }
 69
 70 int main()
 71 {
 72     // NSString *d = [Cat new];
 73     // [d eat];
 74
 75     /*
 76     Animal *aa = [Dog new];
 77     // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
 78     //[aa run];
 79
 80     // 将aa转为Dog *类型的变量
 81     Dog *dd = (Dog *)aa;
 82
 83     [dd run];
 84     */
 85
 86     //Dog *d = [Dog new];
 87
 88     //[d run];
 89
 90     /*
 91     Animal *aa = [Animal new];
 92     feed(aa);
 93
 94     Dog *dd = [Dog new];
 95     feed(dd);
 96
 97     Cat *cc = [Cat new];
 98     feed(cc);
 99      */
100
101     /*
102     // NSString *s = [Cat new];
103     Animal *c = [Cat new];
104
105
106     NSObject *n = [Dog new];
107     NSObject *n2 = [Animal new];
108
109
110     // 多种形态
111     //Dog *d = [Dog new]; // Dog类型
112
113     // 多态:父类指针指向子类对象
114     Animal *a = [Dog new];
115
116     // 调用方法时会检测对象的真实形象
117     [a eat];
118     */
119     return 0;
120 }
时间: 2024-10-17 04:36:49

【学习笔记】【OC语言】多态的相关文章

iOS学习笔记---oc语言第三天

继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量也继承过来了,只是不能访问) 面向对象提供了继承语法.能大大简化代码,把公共的方法和实例对象写在父类里.子类只需要写自己独有的实例变量和方法即可 继承既能保证类的完整,又能简化代码 继承特点 oc中只允许单继承 没有父类的类称为根类,oc中得根类是NSObject(祖宗) 继承的内容:所有的实例变量

iOS学习笔记---oc语言第五天

字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key-value对)的数据 对于“name:张三”来讲,key就是“name”,key对应的value是“张 三” 一个key-value对认为是一个元素(实体),字典是存储key-value对 的容器. 特点: 与数组不同,数组靠下标存取数据,数组的下标是唯一的. 字典靠key存取元素.key不能重复,

iOS学习笔记---oc语言第六天

Block .数组高级 block本质上就是匿名函数(没有名称的函数) block语法和函数指针很相似 回顾函数 函数:C语?中,实现某一类功能的代码段. 完整的函数包含两部分:函数声明.函数定义 函数声明,即函数原型.例如:int sum(int x,int y);具有两个整型参 数,一个整型返回值的函数. 函数定义,即函数实现.例如:int sum(int x,int y){     retrun x + y;     } 回顾函数指针 函数指针(变量):存放函数地址(函数名)的指针变量.

iOS学习笔记---oc语言第四天

字符串 数组 一.使用苹果帮助文档 学会使?用苹果帮助?文档是开发者的?一项技能 Inherits from 继承?自 Conforms to 遵循什么协议 Framework 属于哪个框架 Availability 什么时候可?用的 Declared in 声明在什么头文件?里 Related documents 相关文档 Sample code ?示例代码 快速打开帮助文档 在代码中,将?鼠标停留在 类名或者?法名上,option+?鼠标左键,点击 Reference的超链接进?入帮助?文档

iOS学习笔记---oc语言第二天

实例变量与方法 一.实例变量的可见度 二.方法 oc中的方法分两种:类方法和实例方法 类方法:只能类使用 eg:+ (id)alloc  注:类方法中不能使用实例变量 实例方法:只能对象使用,eg:- (void)sayHi iOS学习笔记---oc语言第二天

iOS学习笔记---oc语言第七天

类的扩展 NSDate是Cocoa中用于处理日期和时间的基础类,封装了某一给定的时刻,具体的日期 时间和时区 使用+date方法获取当前日期和时间 1 NSDate *date = [NSDate date];//获取当前时间 2 NSLog(@"%@",date);//无论你是哪个时区的时间,打印的总是o时区的时间 3 NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:60*60*8];//从现在开始之后的时间 4 NSLog(

ios学习笔记---c语言第二天

一.bool布尔类型    c语言没有bool类型,oc里有bool类型 是一种非真即假的数据类型,布尔类型的变量只有yes和no两个值.yes表示表达式是真,no表示表达式是假. 在c语言中认为非0即为真. 分支语句中常用bool值做判断,判断执行if语句还是else语句. 循环结构中,也常使用bool值做判断,判断是否要执行循环. 注意事项: #define yes 1 #define no 0 计算机在识别时,yes就替换成1,no就替换成0. 二.关系运算符 >   >=   <

iOS学习笔记---c语言学习第七天

结构体 结构体是一种自定义的数据类型 struct 结构体名 { 类型说明符  成员名: … 类型说明符  成员名: }: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { struct teacher{ char name[30]; char sex; int age; char course[30]; }; typedef struct teacher Teacher; Teacher c

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2