您的位置:首页 > 移动开发 > Objective-C

[整理]Objective-C与C++的不同和鸭子类型

2013-11-26 11:14 337 查看
Objective-C是一种通用高级面向对象编程语言。它扩展了标准的ANSIC编程语言,将Smalltalk式的消息传递机制加入到ANSIC中。

Objective-C最大的特色是承自Smalltalk的信息传递模型(messagepassing) 。Objective-C里,与其说对象互相调用方法,不如说对象之间互相传递信息更为精确。此二种风格的主要差异在于调用方法/传递模型这个动作。C++里类型方法的关系严格清楚,一个方法必定属于一个类型,而且在编译时(compiletime)就已经紧密绑定,不可能调用一个不存在类型里的方法。但在Objective-C,类型信息的关系比较松散,调用方法视为对对象发送信息,所有方法都被视为对信息的回应。所有信息处理直到运行时(runtime)才会动态决定,并交由类型自行决定如何处理收到的信息。也就是说,一个类型不保证一定会回应收到的信息,如果类型收到了一个无法处理的信息,程序只会抛出异常,不会出错或崩溃。

例如:[Police move]

典型的C++意义解读是“调用 Police 类型的move方法”。若 Police类型里头没有定义move方法,那编译肯定不会通过。但是Objective-C里,我们应当解读为“发提交一个move的信息给 Police 对象”,move是信息,而 Police是信息的接收者。 Police 收到信息后会决定如何回应这个信息,若 Police 类型内定义有move方法就运行方法内之代码,若 Police 内不存在move方法,则程序依旧可以通过编译,运行期则抛出异常。

此二种风格各有优劣。C++强制要求所有的方法都必须有对应的动作,且编译期绑定使得函数调用非常快速。缺点是仅能借由virtual关键字提供有限的动态绑定能力。Objective-C天生即具备鸭子类型之动态绑定能力,因为运行期才处理信息,允许传送未知信息给对象。可以送信息给整个对象集合而不需要一一检查每个对象的型态,也具备消息转送机制。同时空对象nil接受信息后默认为不做事,所以送信息给nil也不用担心程序崩溃。

何为鸭子类型呢?

程序设计中,鸭子类型英语duck
typing
)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述 。

鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: