一、基本概念

  多态在代码中的体现,即为某一类事物的多种形态,OC对象具有多态性。必须要有继承,没有继承就没有多态。

  在使用多态时,会进行动态检测,以调用真实的对象方法。

  多态在代码中的体现即父类指针指向子类对象。

1 Person *p = [Student new];
2
3 p->age = 100;
4
5 [p walk];

二、多态使用注意

  1.多态的好处

    用父类接收参数,节省代码 

    需要一个新的函数专门用来喂狗

    void feed(Dog *d)

    {

      [d  eat];

    }

    如果这个时候也需要喂猫,那就应该重写新一个新的函数

    void feed(Cat *c)

    {

      [c  eat];

    }

    而狗和猫实际上都继承自动物这个类,在这里就可以使用多态来简化代码了。

    这里只需要把函数的参数写成是Animal *类型的,那么Dog和Cat类型的对象就都可以传入进来。

    调用的时候直接改变参数就可以了。

  2.多态的局限性

     不能访问子类的属性(可以考虑强制转换)

    不建议的做法:

    Animal *a=[[Dog alloc] init];

    [a run]; // 在Animal类中没有run方法,这里调用了狗对象的方法。

    解决方法:可以将a强制转换为Dog*类型的变量,如下:

    Dog *d=(Dog *)a; // 使用强制转换,这里a和d指向的是同一个狗对象

  3.多态的细节

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

三、NSString的简单使用

 1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4 {
5 //char *_name;
6 NSString *_name;
7 }
8 @end
9
10 int main()
11 {
12 /*
13 // 最简单的创建字符串的方式
14 NSString *str = @"itcast";
15
16 char *name = "itcast";
17
18
19 NSLog(@"我在%@上课", str);
20 //NSLog(@"%s", name);
21 */
22
23 int age = 15;
24 int no = 5;
25
26 NSString *name = @"哈哈jack";
27
28 // length方法算的是字数
29 int size = [name length];
30
31 NSLog(@"%d", size);
32
33 // 创建OC字符串的另一种方式
34 NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@", age, no, name];
35
36
37 NSLog(@"---- %ld", [newStr length]);
38
39 return 0;
40 }

  注意:

    字符串对象的length方法:计算的是字符串的字数,而不是像strlen函数那样,计算的是字符数。如“哈ha123”length得出的结果是6,返回unsigned long类型,而strlen函数得出的结果是8,因为一个汉字占3个字节。

  提示:字数也包括空格。

四、多态使用实例

 1 #import <Foundation/Foundation.h>
2
3 // 动物
4 @interface Animal : NSObject
5 - (void)eat;
6 @end
7
8 @implementation Animal
9 - (void)eat
10 {
11 NSLog(@"Animal-吃东西----");
12 }
13 @end
14
15 // 狗
16 @interface Dog : Animal
17 - (void)run;
18 @end
19
20 @implementation Dog
21 - (void)run
22 {
23 NSLog(@"Dog---跑起来");
24 }
25 - (void)eat
26 {
27 NSLog(@"Dog-吃东西----");
28 }
29 @end
30
31 // 猫
32 @interface Cat : Animal
33
34 @end
35
36 @implementation Cat
37 - (void)eat
38 {
39 NSLog(@"Cat-吃东西----");
40 }
41 @end
42
43 // 如果参数中使用的是父类类型,可以传入父类、子类对象
44 void feed(Animal *a)
45 {
46 [a eat];
47 }
48
49 int main()
50 {
51 NSString *d = [Cat new];
52 [d eat];
53
54 /*
55 Animal *aa = [Dog new];
56 // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
57 //[aa run];
58
59 // 将aa转为Dog *类型的变量
60 Dog *dd = (Dog *)aa;
61
62 [dd run];
63 */
64
65 //Dog *d = [Dog new];
66
67 //[d run];
68
69 /*
70 Animal *aa = [Animal new];
71 feed(aa);
72
73 Dog *dd = [Dog new];
74 feed(dd);
75
76 Cat *cc = [Cat new];
77 feed(cc);
78 */
79
80 /*
81 // NSString *s = [Cat new];
82 Animal *c = [Cat new];
83
84
85 NSObject *n = [Dog new];
86 NSObject *n2 = [Animal new];
87
88
89 // 多种形态
90 //Dog *d = [Dog new]; // Dog类型
91
92 // 多态:父类指针指向子类对象
93 Animal *a = [Dog new];
94
95 // 调用方法时会检测对象的真实形象
96 [a eat];
97 */
98 return 0;
99 }

「OC」 多态的更多相关文章

  1. 「OC」 封装

    一.面向对象和封装 面向对象的三大特性:封装.继承和多态 在OC语言中,使用@interface和@implementation来处理类.   @interface就好像暴露在外面的时钟表面,像外界提 ...

  2. 「OC」 基本语法

    一.OC简介 在C语言的基础上,增加了一层最小的面向对象语法:完全兼容C语言:可以在OC代码中混入C语言代码,甚至是C++代码:可以使用OC开发Mac OS X平台和iOS平台的应用程序. 二.OC语 ...

  3. 「OC」block 和 protocol

    一.block   (一)简介 block 是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,block 可以在任何时候执行.在多线程.异步任务.集合遍历.集合排序.动 ...

  4. 「OC」内存管理

    一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空 ...

  5. 「OC」构造方法和分类

    一.构造方法 (一)构造方法的调用 创建一个可用的对象:Person *p=[Person new]; new方法实际上是分为两步来创建一个对象: 1)使用+alloc方法来分配存储空间(返回分配的对 ...

  6. 「OC」点语法和成员变量的作用域

    一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObje ...

  7. 「OC」 继承

    一.基本用法 1.设计两个类Bird.Dog 1 // Bird的声明 2 @interface Bird : NSObject 3 { 4 @public 5 int weight; 6 } 7 - ...

  8. 「OC」类和对象

    一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类. 术语:OO ...

  9. 「OC」类的深入研究、description方法和sel

    一.类的深入研究 (一)类的本质 类本身也是一个对象,是class类型的对象,简称“类对象”. Class类型的定义: Typedef struct obj class *class; 类名就代表着类 ...

随机推荐

  1. Ubuntu12.04获取root权限

    有的时候我们需要Ubuntu的root权限,我们该如何获取呢? 其实,很简单,我们只需要在终端中输入以下命令即可获得root权限. 第一步,打开终端 ( ctrl+alt+T ) 第二步,输入命令:s ...

  2. elk 日志处理的一点思路

    zjtest7-frontend:/usr/local/logstash-2.3.4/bin# ./logstash -f ../config/logstash_agent.conf zjtest7- ...

  3. elk 数据存储

    让我们在集群中唯一一个空节点上创建一个叫做blogs的索引,默认情况下,一个索引被分配5个主分片, 但是为了演示的目的, 我们只分配3个主分片和一个复制分片(每个主分片都有一个复制分片): PUT / ...

  4. Android系统JNI的实现方式

     Android系统JNI的实现方式 All rights reserved JNI(Java Native Interface)定义了一种Java代码调用C或者C++代码等其它代码的方式. 在A ...

  5. IE能够打开网页 可是chrome和火狐打不开网页解决的方法

    一次偶然.电脑的浏览器打不开经常使用的网页,奇怪的是IE能够打开 之外的其它浏览器都不能够,结果百度一下.找到一个帖子,亲自測试一下,果真能够解决.记录例如以下: (1)開始-执行-输入CMD-确定- ...

  6. Unable to locate appropriate constructor on class异常

    一般出现Unable to locate appropriate constructor on class这个异常,都是实体类的带参数的构造方法和使用查询语句出现偏差,两个地方的代码如下: 一般都是第 ...

  7. 五毛的cocos2d-x学习笔记06-处理用户交互

    前几篇感觉自己在写教育文章,╮(╯▽╰)╭.今天换成开发者的口吻,毕竟我也是在边学边写博客. 处理用户交互包括:单点触摸.多点触摸.事件传递.传感器.物理按键等部分. 单点触摸: 触摸事件传递顺序 o ...

  8. Java学习之抽象类的总结

    抽象类的特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类必须也被abstract修饰.2,抽象类不可以被实例化.为什么?因为调用抽象方 ...

  9. css伪类伪元素

    在CSS中,模式(pattern)匹配规则决定哪种样式规则应用于文档树(document tree)的哪个元素.这些模式叫着选择符(selector). 一条CSS规则(rule)是选择符{属性:值; ...

  10. php分页实例附代码

    一个典型的PHP分页实例代码分享,学习php的朋友肯定用得到,主要是了解思路: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...