从 C++ 到 Objective-C(8):继承(续)参考模板_第1页
从 C++ 到 Objective-C(8):继承(续)参考模板_第2页
从 C++ 到 Objective-C(8):继承(续)参考模板_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、从 C+ 到 Objective-C(8):继承(续)作者: DevBean 日期: 2011 年 03 月 22 日发表评论 (3)查看评论Protocol 对象运行时,协议就像是类对象,其类型是 Protocol*。例如,conformsToProtocol: 方法就需要接受一个 Protocol* 类型的参数。protocol 关键字不仅用于声明协议,还可以用于根据协议名返回 Protocol* 对象。Protocol* myProtocol = protocol(协议名)远程对象的消息传递由于 Objective-C 的动态机制,远程对象之间的消息传递变得

2、很简单。所谓远程对象,是指两个或多个处于不同程序,甚至不同机器,但是可以通过代理完成同一任务,或者交换信息的对象。正式协议就是一种可以确保对象提供了这种服务的有效手段。正式协议还提供了很多额外的关键字,可以更好的说明各种参数。这些关键字分别是 in, out, inout, bycopy, byref 和 oneway。这些关键字仅对远程对象有效,并且仅可以在协议中使用。出了协议,它们就不被认为是关键字。这些关键字被插入到在协议中声明的方法原型之中,提供它们所修饰的参数的额外信息。它们可以告知,哪些是输入参数,哪些是输出参数,哪些使用复制传值,哪些使用引用传值,方法是否是同步的等等。以下是详细

3、说明:· in:参数是输入参数;· out:参数是输出参数;· inout:参数即是输入参数,又是输出参数;· bycopy:复制传值;· byref:引用传值;· oneway:方法是异步的,也就是函数调用会立即返回(否则的话,调用者会一直堵塞,直到被调用函数执行完毕,即使被调用者返回值是 void,也同样会被阻塞)。它的返回值必须是 void(其它返回值是没有意义的,因为被调用函数是立即返回,必然无法得到正确的返回值)。例如,下面就是一个返回对象的异步方法:-(oneway void) giveMeAnObjectWhenAvai

4、lable:(bycopy out id *)anObject;默认情况下,参数都被认为是 inout 的。如果参数由 const 修饰,则被当做 in 参数。为参数选定是 in 还是 out,可以作为一种优化手段。参数默认都是传引用的,方法都是同步的(也就是不加 oneway)。对于传值的参数,也就是非指针类型的,out 和 inout 都是没有意义的,只有 in 是正确的选择。1 / 3分类创建类的分类 categories,可以将一个很大的类分割成若干小部分。每个分类都是类的一部分,一个类可以使用任意多个分类,但都不可以添加实例数据。分类的好处是:· 对于精益求精的开发者,分类

5、提供了一种划分方法的机制。对于一个很大的类,它可以将其划分成不同的角色;· 分类允许分开编译,也就是说,同一个类也可以进行多人的分工合作;· 如果把分类的声明放在实现文件(.m)中,那么这个分类就只在文件作用域中可见(虽然这并没有调用上的限制,如果你知道方法原型,依然可以调用)。这样的分类可以取一个合适的名字,比如 FooPrivateAPI;· 一个类可以在不同程序中有不同的扩展,而不需要丢弃通用代码。所有的类都可以被扩展,甚至是 Cocoa 中的类。最后一点尤其重要。很多开发人员都希望标准类能够提供一些对他们而言很有用的方法。这并不是一个很困难的问题,使用继承

6、即可实现。但是,在单继承的环境下,这会造成出现很多的子类。仅仅为了一个方法就去继承显得有些得不偿失。分类就可以很好的解决这个问题:C+Objective-Cclass MyString : public stringpublic: / 统计元音的数目 int vowelCount(void); int MyString:vowelCount(void).interface NSString (VowelsCounting)/ 注意并没有使用 -(int) vowelCount; / 统计元音的数目end implementation NSString (VowelsCoun

7、ting)-(int) vowelCount.end在 C+ 中,这是一个全新的类,可以自由使用。在 Objective-C 中,NSString 是 Cocoa 框架的一个标准类。它是使用分类机制进行的扩展,只能在当前程序中使用。注意此时并没有新增加类。每一个 NSString 对象都可以从这个扩展获得统计元音数目的能力,甚至常量字符串也可以。同时注意,分类不能增加实例数据,因此没有花括号块。分类也可以使匿名的,更适合于 private 的实现:interface NSString ()/ 注意并没有使用 -(int) myPrivateMethod;end implementation NSString ()-(int) myPrivateMethod.end混合使用协议、分类和子类混合使用协议、分类和子类的唯一限制在于,你不能同时声明子类和分类。不过,你可以使用两步来绕过这一限制:interface Foo1 : SuperClass /okend interface Foo2 (Category) /okend / 下面代码会有编译错误interface

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论