初探Object-c 3 :多态,动态类型,动态绑定
2015-04-01 17:02
330 查看
先来看看自己写的一个例子,参考Objective-C 2.0程序设计
在上篇Fraction类的基础上,再新建了一个Complex类,作为一个虚数类。
测试类如下:
输出 :
可以看到,id类型在接受不同类的赋值的时候,都可以作为一个具体的类的事例。
id类型是OC中的动态类型,可以被视为通用的对象类型。就是说id类型可以属于任何类的对象。在运行时,系统首先检查存储在dataValue中的对象类型,然后调用所属对象中的对应的方法。正如上面代码中idValue在属于不同类的对象时调用了不同类属的print方法。
如果使用动态类型来调用一个方法,需要注意,如果在多个类中实现名称相同的方法,那每个方法都必须符合各个参数的类型和返回值类型。这样编译器才能为消息表达式生成正确的代码
—-来源书上
使用动态类型,有一些方法可以来对类型的所属类进行判断
在上篇Fraction类的基础上,再新建了一个Complex类,作为一个虚数类。
// // Complex.h // MyProduct // // Created by 陈思博 on 15/4/1. // Copyright (c) 2015年 陈思博. All rights reserved. // #import <Foundation/Foundation.h> @interface Complex : NSObject { double real; double imaginary; } @property double real,imaginary; -(void) print; -(void) setReal:(double) r andImaginary:(double) i; -(Complex *) add:(Complex *) f; @end
// // Complex.m // MyProduct // // Created by 陈思博 on 15/4/1. // Copyright (c) 2015年 陈思博. All rights reserved. // #import "Complex.h" @implementation Complex @synthesize real,imaginary; -(void) print { NSLog(@"%g + %gi ",real , imaginary); } -(void) setReal:(double)r andImaginary:(double)i { real = r; imaginary = i; } -(Complex *) add :(Complex *) f { Complex *result =[[Complex alloc] init]; [result setReal:f.real+real andImaginary:f.imaginary+imaginary]; return result; } @end
测试类如下:
// // main.m // MyProduct // // Created by 陈思博 on 15/4/1. // Copyright (c) 2015年 陈思博. All rights reserved. // #import <Foundation/Foundation.h> #import "Fraction.h" #import "Student.h" #import "Complex.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... id Idvalue; Fraction * aFraction = [[Fraction alloc] init]; Fraction * bFraction = [[Fraction alloc] init]; [aFraction setTo:3 over:5]; [bFraction setTo:1 over:9]; [aFraction print]; [bFraction print]; NSLog(@"idvalue is "); Idvalue = [aFraction add:bFraction]; // [[aFraction add:bFraction] print]; [Idvalue print]; Complex *aComplex = [[Complex alloc] init]; Complex *bComplex = [[Complex alloc] init]; [aComplex setReal:2 andImaginary:5]; [bComplex setReal:5 andImaginary:8]; Idvalue = [aComplex add:bComplex]; NSLog(@"idvalue is "); [Idvalue print]; // [[aComplex add:bComplex] print]; } return 0; }
输出 :
2015-04-01 16:35:40.482 MyProduct[2402:126700] 3/5 2015-04-01 16:35:40.484 MyProduct[2402:126700] 1/9 2015-04-01 16:35:40.484 MyProduct[2402:126700] idvalue is 2015-04-01 16:35:40.485 MyProduct[2402:126700] 32/45 2015-04-01 16:35:40.485 MyProduct[2402:126700] idvalue is 2015-04-01 16:35:40.485 MyProduct[2402:126700] 7 + 13i Program ended with exit code: 0
可以看到,id类型在接受不同类的赋值的时候,都可以作为一个具体的类的事例。
id类型是OC中的动态类型,可以被视为通用的对象类型。就是说id类型可以属于任何类的对象。在运行时,系统首先检查存储在dataValue中的对象类型,然后调用所属对象中的对应的方法。正如上面代码中idValue在属于不同类的对象时调用了不同类属的print方法。
使用id类型要注意的问题
虽然id类型非常灵活,但是不能大规模的使用在程序中。究其原因,是因为id类型只有在运行时才被检查类的所属。相对于静态的类型定义,如Complex *f,在编译的时候就接受检查,动态类型更容易报错而且不会被发现。如果使用动态类型来调用一个方法,需要注意,如果在多个类中实现名称相同的方法,那每个方法都必须符合各个参数的类型和返回值类型。这样编译器才能为消息表达式生成正确的代码
—-来源书上
使用动态类型,有一些方法可以来对类型的所属类进行判断
相关文章推荐
- Objective-c 特性之多态、动态类型和动态绑定
- 多态、动态类型和动态绑定
- 多态,动态类型,动态绑定
- 解析Objective-C中多态、动态类型和动态绑定
- iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
- 9-多态、动态类型和动态绑定
- Objective-C程序设计第九章---多态、动态类型和动态绑定
- Objective-C 学习笔记 9 多态,动态类型,动态绑定
- object-c 继承多态 动态数据类型
- 类的多态,动态类型,动态绑定
- objective-c学习笔记第六章《objective-c 多态,动态类型,动态绑定与java中的区别》
- Objective-C多态,动态类型识别,动态绑定
- 四、多态、动态类型和动态绑定
- 语言多态、动态类型和动态绑定
- 二十八、多态性、动态类型 和 动态绑定(一)多态性:不同的措施 共用 同一个名称
- 第04天OC语言(06):动态数据类型(有多态的情况下可以使用)
- ViewBag、ViewData 和 TempData 的区别 及 Dynamically Typed Object 动态类型介绍
- (七)类、超类和子类 ——(多态,动态绑定,final类,类型转换,抽象类)
- Objective-C学习笔记11:多态和动态类型
- 二十九、多态性、动态类型 和 动态绑定(二)动态绑定 和 id类型