您的位置:首页 > 其它

三十、多态性、动态类型 和 动态绑定(三)运行时 VS 编译时

2012-10-28 01:56 288 查看
因为 id类型变量中存储的物件类型 在编译的时候 是 不确定的,所以 某些检查 会被推迟 到程序执行的时候。先 思考一下 下面两行语句:



其中 物件fractionOne 属于 Fraction类型,用来代表 比例,而 setReal:andImaginary:这项措施 是 用来设定 一个复数所包含的实数 和 虚数的值的,只能 针对 代表复数的Complex类型的物件 实施。于是 当编译器 遇到 上面两行语句时,就会发出 这样的警告:



它的意思 是 Fraction类型的物件 可能无法对 -setReal:andImaginary:这项措施 作出 反应,也可以理解为 无法对 Fraction类型的物件 采取 -setReal:andImaginary:这项措施。由于 编译器 知道 变量fractionOne 存储着 Fraction类型的物件,所以 在编译的时候 编译器 就能发现 这个问题。

再 思考一下 下面两行语句:



当编译器 遇到 这两行语句时,就不会发出 任何警告了,因为 编译器 不知道 变量fractionOne当中 会存储 什么类型的物件。但是 在程序 运行的时候,才会出现 错误信息:



程序 运行的时候,运行系统 会检查 变量fractionOne中的物件 属于 什么类型。经过 检查,运行系统 发现 变量fractionOne中的物件 属于 Fraction类型,于是 运行系统 又 检查 setReal:andImaginary:这项措施 是否属于 Fraction这类物件。由于 setReal:andImaginary:这项措施 属于 Complex这类物件,而 不是 Fraction这类物件,所以 就产生了 上述的错误信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐