免费预览已结束,剩余29页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计基础 正式协议 目录 委托 delegate 自己不做 而委托他人来完成某项工作 委托是一种对象 另一个类的对象会要求委托对象执行它的某些操作 即一个对象代替别的对象来完成某些任务 或者是和别的对象一起协调来完成某些工作 其中 委托者须持有对被委托者的引用 并在适当的时间发送消息给被委托者 对象a需要完成某个操作dosometing 但是a没有实现这个操作 而对象b实现了dosomething 这个操作 那么对象a可以委托对象b完成此操作 委托者 被委托者 例子 小孩在树上摘下水果后会询问大人 这个可以吃吗 大人同意后才往嘴里放 委托 delegate Baby Mother 委托者 被委托者 委托 Cocoa中的类经常使用委托 delegate 的技术 例如 当AppKit类的NSApplication启动时 它会询问其委托对象是否应该打开一个无标题窗口 NSWindow类的对象询问它们自己的委托对象是否应该允许关闭某个窗口 更常用的是 编写委托对象并将其提供给其他一些对象 通常是提供给Cocoa生成的对象 通过实现特定的方法 你可以控制Cocoa中的对象的行为 Cocoa中的滚动列表是由AppKit类的NSTableView处理的 当tableView对象准备好执行某些操作 例如选择用户刚刚点击的行 时 它询问其委托对象是否选择此行 tableView对象给其委托对象发送一条消息 BOOL tableView NSTableView tableViewshouldSelectRow int row 非正式协议 委托强调类别的另一种应用 被发送给委托对象的方法可以声明为一个NSObject的类别 创造一个NSObject类的类别称为 创建一个非正式协议 因为基本所有的常用类都继承自NSObject类 所以我们可以在任何类中使用该类别实现的方法 非正式协议 interfaceNSObject NSNetServiceBrowserDelegateMethods void netServiceBrowserWillSearch NSNetServiceBrowser browser void netServiceBrowser NSNetServiceBrowser aNetServiceBrowserdidFindService NSNetService servicemoreComing BOOL moreComing void netServiceBrowserDidStopSearch NSNetServiceBrowser browser void netServiceBrowser NSNetServiceBrowser browserdidRemoveService NSNetService servicemoreComing BOOL moreComing end 通过将这些方法声明为NSObject的类别 NSNetServiceBrowser的实现可以将这些消息之一发送给任何对象 无论这些对象实际上属于哪个类 这也意味着 只要对象实现了委托方法 任何类的对象都可以成为委托 响应选择器 当试图发送一个对象无法理解的消息时 Objective C会给出运行时错误 类方法 selectornotrecognized如何知道委托对象能否处理发送给他的响应消息 首先检查对象 询问其能否响应该选择器 如果该对象能够响应该选择器 则给它发送消息 选择器只是一个方法名称 但它以Objective C运行时使用的特殊方式编码 以快速执行查询 可以使用 selector 预编译指令指定选择器 其中方法名位于圆括号中 因此 Car类的setEngine 方法的选择器将是 selector setEngine 而Car类的setTire atIndex 方法的选择器 selector setTire atIndex Car car Caralloc init if carrespondsToSelector selector setEngine NSLog yowza 非正式协议是NSObject的一个类别 它可以列出对象能够响应的方法 非正式协议用于实现委托 委托是一种允许你轻松定制对象行为的技术 目录 什么是正式协议 在日常生活中 我们对特别重要的协商结果都要签订协议 比如就业签订劳动合同 购买商业保险 购买住房等 有了正式协议 能够约束有关各方遵循约定 避免产生矛盾 在软件设计中 引入正式协议则是让程序的意图更加明确 可读性更好 为什么需要正式的协议 Objective C2 0为我们提供了非正式协议 能够让委托对象参与决策 实现灵活的控制 1 委托对象不一定会实现非正式协议的全部方法 2 程序的可读性不高 3 程序较难维护 正式协议 正式协议与非正式协议一样都是一个命名的方法列表 但正式协议要求被显示地采用 从而程序的可读性更高 且较易维护 可以把正式协议看作是一组公用的方法声明 谁想采用协议 谁就实现负责正式协议中的全部方法 声明正式协议 使用protocol关键字声明一般只声明需要实现的方法 protocolNSCopying 复制 id copyWithZone NSZone zone end protocolNSCoding 编码 void encodeWithCoder NSCoder aCoder id initWithCoder NSCoder aDecoder end 创建一个 h文件 注意协议中没有变量 在超类后用指出需要采用的协议名称 并在实现文件中实现协议中的全部方法 采用协议 可以实现多个协议 interfaceCar NSObject instancevariables methods end Car interfaceCar NSObject 目录 示例背景 很多仪器都需要显示温度不同国家显示语言不同文本方式和图形界面显示不同 声明显示协议 import protocolIDisplay 协议名称 void show int val 显示最新的温度 end IDisplay h 基本显示类 import import IDisplay h interfaceCBaseDashboard NSObject void show int val end import CBaseDashboard h implementationCBaseDashboard void show int val void init if self superinit selfautorelease void dealloc NSLog CBaseDashboarddealloc end CBaseDashboard 英文版显示 import CBaseDashboard h interfaceCEnglishDashboard CBaseDashboard end import CEnglishDashboard h implementationCEnglishDashboard void show int val NSLog temperature dC val void dealloc NSLog CEnglishDashboarddealloc superdealloc end CEnglishDashboard 中文版显示 import CBaseDashboard h interfaceCChineseDashboard CBaseDashboard end import CChineseDashboard h implementationCChineseDashboard void show int val NSLog 温度 d摄氏度 val void dealloc NSLog CChineseDashboarddealloc superdealloc end CChineseDashboard 测试显示 idgetDisplay intflag if 1 flag return CChineseDashboardnew return CEnglishDashboardnew intmain intargc constchar argv NSAutoreleasePool pool NSAutoreleasePoolalloc init idps getDisplay 1 psshow 100 ps getDisplay 2 psshow 100 pooldrain return0 用协议来修饰变量 说明该变量需要遵循我们制定的这个协议 目录 内存管理规则 new alloc 或者copy方法产生的实例需要自己负责释放 release autorelease 除上述方法外其他方法产生的对象是自动释放的 不用操心retain和release方法调用次数应该匹配 复制的种类 浅拷贝只复制对象的地址 比如NSArray中的对象深拷贝克隆另一个全部属性相同的对象 引擎的复制 interfaceEngine NSObject end Engine id copyWithZone NSZone zone Engine engineCopy engineCopy selfclass allocWithZone zone init return engineCopy copyWithZone 该协议要求实现一个方法 id copyWithZone NSZone zone EngineallocWithZone zone 指向可供分配的内存区域 向对象发送copy消息 实际上会调用copyWithZone 方法 selfclass 能让所有引擎的派生类正常工作复制的对象需要自己管理内存释放 轮胎的复制 interfaceTire NSObject floatpressure floattreadDepth methods end Tire id copyWithZone NSZone zone Tire tireCopy tireCopy selfclass allocWithZone zone initWithPressure pressuretreadDepth treadDepth return tireCopy copyWithZone 轮胎子类的复制 interfaceAllWeatherRadial Tire floatrainHandling floatsnowHandling methods end AllWeatherRadial id copyWithZone NSZone zone AllWeatherRadial tireCopy tireCopy supercopyWithZone zone tireCopysetRainHandling rainHandling tireCopysetSnowHandling snowHandling return tireCopy copyWithZone 汽车的复制 interfaceCar NSObject NSString applellation 名称NSMutableArray tires Engine engine methods end Car id copyWithZone NSZone zone Car carCopy carCopy selfclass allocWithZone zone init carCopy name self name Engine engineCopy engineCopy enginecopy autorelease carCopy engine engineCopy for inti 0 i 4 i Tire tireCopy tireCopy selftireAtIndex i copy tireCopyautorelease carCopysetTire tireCopyatIndex i return carCopy copyWithZone 使用复制的汽车 Car car Caralloc init car name Herbie for inti 0 i 4 i AllWeatherRadial tire tire AllWeatherRadialalloc init carsetTire tireatIndex i tirerelease Slant6 engine Slant6alloc init car engine engine enginerelease carprint Car carCopy carcopy carCopyprint carrelease carCopyrelease poolrelease 目录 正式的协议补充说明 Objective C2 0为我们提供了正式协议两类方法 1 required 表示必须实现的方法 2 optional 表示可选的实现 正式协议有逐渐取代非
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋认购金合同范本
- 房屋赠与继承协议书
- 房屋过户给合同范本
- 房租托管责任协议书
- 房租购买过户协议书
- 房车改装拆合同范本
- 所的借款都合同范本
- 手工艺培训合同范本
- 手机委托租赁协议书
- 手表寄售协议书模板
- 雨课堂在线学堂《信息素养-学术研究的必修课》作业单元考核答案
- 挡土墙施工私人协议书
- 2025年秋人教 PEP 版小学英语四年级上册期中检测试卷及答案(共3套)
- 财务管理记账工作表格模板
- 2025后勤考试试卷及答案
- 山东省青岛市市南区2023-2024学年八上期末数学试题(原卷版)
- 灌溉渠工程项目可行性研究报告
- 2025劳动合同书(上海市人力资源和社会保障局监制)
- 专利布局培训课件
- 仪表实操题库-《化工仪表维修工》(初级工)实际操作考核试卷
- 第15课 红红火火中国年(教学课件)小学二年级上册 统编版《道德与法治》新教材
评论
0/150
提交评论