二十八、多态性、动态类型 和 动态绑定(一)多态性:不同的措施 共用 同一个名称
2012-10-28 01:48
211 查看
从本篇博文 开始,我 要介绍 关于objective-c的三个特性。它们 分别 是:多态性、动态类型 和 动态绑定。这三个特性 使 objective-c 成为 一种非常强大的编程语言,而且 还 使 objective-c 与 其他面向对象的编程语言,比如 c++,显著不同。
在本篇博文当中,我 只 介绍 多态性。多态性 可以使 你 为 不同类型的物件 创建 名称相同 但 内容不同的措施。首先 我 创建 一类叫作Complex的物件 用来代表 复数:
Complex.h:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-314.jpg)
Complex.m:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-315.jpg)
我们 知道 比例,也就是 分数,由分子 和 分母 组成。同样的道理,复数 是 由实数 和 虚数 组成的。于是 我 在Complex.h这个文件当中 用 双精度的变量real 和 imaginary 分别 表示 实数 和 虚数,每个 Complex类型的物件 都会包含 real 和 imaginary这两个变量。除此之外 我 还 告诉 计算机 可以对Complex类型的物件 采取 print、setReal:andImaginary: 和 add:这三项措施,文件Complex.m
说明了 这三项措施的具体内容,这 跟 Fraction这类物件 大同小异。print这项措施 是 将 某个复数 显示出来,由于 objective-c 属于 c语言的超级集合,对 c语言 保持兼容,所以 这里 使用了 printf(),你 也许 已经 发现了 NSLog() 无论 显示 什么内容,都会 自动 换行。setReal:andImaginary:这项措施 用来设定 某个复数的实数 和 虚数部分。add:这项措施 是 将 两个复数 相加,add:这项措施的实施对象
就是 第一个加数,而 第二个加数 则是 这项措施的参数。
接下来 是 主程序main.m:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-316.jpg)
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-317.jpg)
由于 我 需要创建 Fraction 和 Complex这两种类型的物件 分别 来代表 比例 和 复数,于是 我 在程序的开头 导入了 ”Fraction.h” 和 ”Complex.h”这两个文件,而 ”Fraction.h” 和 ”Fraction.m”这两个文件 我 在这里 就省略了。
在这个程序中 我 分别 创建了 两个Fraction类型的物件 来代表 两个比例 和 两个Complex类型的物件 来代表 两个复数。而且 我 给 两个Fraction类型的物件所代表的比例 和 两个Complex类型的物件所代表的复数 设定了 值。最后 我 将 两个比例 和 两个复数 分别 相加,并且 将 两个比例相加的结果 和 两个复数相加的结果 显示了出来。
运行 这个程序 可以得到 这样的结果:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-318.jpg)
你 只要查看一下 Fraction.h 和 Complex.h这两个文件 就会发现 Fraction 和 Complex这两个物件类型 都包含了 add: 和 print这两项措施,那么 在执行 这样的语句时:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-319.jpg)
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-323.jpg)
程序 怎么知道 采取 哪个add:措施 以及 哪个print措施呢?这 很 简单:fractionOne这个物件 属于 Fraction类型,那么 就 对 其 采取 属于Fraction类型的add:措施;complexResult这个物件 属于 Complex类型,那么 就 对 其 采取 属于Complex类型的print措施。
系统 总是 会携带 哪个物件 属于 哪个类型之类的信息,这样 程序 就可以 在运行的时候 决定 采取 哪项措施,而 不需要 在编译的时候 决定了。属于不同物件类型的措施 共用 同样一个名称的特性 就叫作 多态性。有了 这种特性,你 在创建 新的物件类型时,就可以 为新的物件类型 编写 与已存在的措施同名的措施了。
在本篇博文当中,我 只 介绍 多态性。多态性 可以使 你 为 不同类型的物件 创建 名称相同 但 内容不同的措施。首先 我 创建 一类叫作Complex的物件 用来代表 复数:
Complex.h:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-314.jpg)
Complex.m:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-315.jpg)
我们 知道 比例,也就是 分数,由分子 和 分母 组成。同样的道理,复数 是 由实数 和 虚数 组成的。于是 我 在Complex.h这个文件当中 用 双精度的变量real 和 imaginary 分别 表示 实数 和 虚数,每个 Complex类型的物件 都会包含 real 和 imaginary这两个变量。除此之外 我 还 告诉 计算机 可以对Complex类型的物件 采取 print、setReal:andImaginary: 和 add:这三项措施,文件Complex.m
说明了 这三项措施的具体内容,这 跟 Fraction这类物件 大同小异。print这项措施 是 将 某个复数 显示出来,由于 objective-c 属于 c语言的超级集合,对 c语言 保持兼容,所以 这里 使用了 printf(),你 也许 已经 发现了 NSLog() 无论 显示 什么内容,都会 自动 换行。setReal:andImaginary:这项措施 用来设定 某个复数的实数 和 虚数部分。add:这项措施 是 将 两个复数 相加,add:这项措施的实施对象
就是 第一个加数,而 第二个加数 则是 这项措施的参数。
接下来 是 主程序main.m:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-316.jpg)
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-317.jpg)
由于 我 需要创建 Fraction 和 Complex这两种类型的物件 分别 来代表 比例 和 复数,于是 我 在程序的开头 导入了 ”Fraction.h” 和 ”Complex.h”这两个文件,而 ”Fraction.h” 和 ”Fraction.m”这两个文件 我 在这里 就省略了。
在这个程序中 我 分别 创建了 两个Fraction类型的物件 来代表 两个比例 和 两个Complex类型的物件 来代表 两个复数。而且 我 给 两个Fraction类型的物件所代表的比例 和 两个Complex类型的物件所代表的复数 设定了 值。最后 我 将 两个比例 和 两个复数 分别 相加,并且 将 两个比例相加的结果 和 两个复数相加的结果 显示了出来。
运行 这个程序 可以得到 这样的结果:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-318.jpg)
你 只要查看一下 Fraction.h 和 Complex.h这两个文件 就会发现 Fraction 和 Complex这两个物件类型 都包含了 add: 和 print这两项措施,那么 在执行 这样的语句时:
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-319.jpg)
![](http://www.tongwenguan.com/wp-content/uploads/2012/02/ishot-323.jpg)
程序 怎么知道 采取 哪个add:措施 以及 哪个print措施呢?这 很 简单:fractionOne这个物件 属于 Fraction类型,那么 就 对 其 采取 属于Fraction类型的add:措施;complexResult这个物件 属于 Complex类型,那么 就 对 其 采取 属于Complex类型的print措施。
系统 总是 会携带 哪个物件 属于 哪个类型之类的信息,这样 程序 就可以 在运行的时候 决定 采取 哪项措施,而 不需要 在编译的时候 决定了。属于不同物件类型的措施 共用 同样一个名称的特性 就叫作 多态性。有了 这种特性,你 在创建 新的物件类型时,就可以 为新的物件类型 编写 与已存在的措施同名的措施了。
相关文章推荐
- 三十二、多态性、动态类型 和 动态绑定(五)措施所附带的参数 和 所产生的结果类型
- 三十三、多态性、动态类型 和 动态绑定(六)关于物件类型的问题
- 三十四、多态性、动态类型 和 动态绑定(七)用 @try命令 处理 意外情况
- 将多个不同类型的控件放在一个动态数组(ArrayList)中作为参数(控件数组)传递
- Obj-C的多态性、动态类型和动态绑定
- Obj-C的多态性、动态类型和动态绑定
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- IOS开发中的多态性、动态类型和动态绑定
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- 二十九、多态性、动态类型 和 动态绑定(二)动态绑定 和 id类型
- 三十、多态性、动态类型 和 动态绑定(三)运行时 VS 编译时
- 三十一、多态性、动态类型 和 动态绑定(四)id类型 和 静态类型
- extjs 添加和编辑共用一个FormPanel,根据不同的动作动态改URL
- c++ 如何获得一个变量的类型名称?
- Android 动态修改app名称(市场和手机中显示两个不同的名称)
- 将一个枚举类型动态绑定到一个列表控件的方法
- 使用动态sql,一个SP为不同的表更新相同字段值
- iOS动态类型和动态绑定
- 获取一个类型中某个属性的名称
- 不同的单元中的类可以共用同一个命名空间