OBJC-15-正式协议_第1页
OBJC-15-正式协议_第2页
OBJC-15-正式协议_第3页
OBJC-15-正式协议_第4页
OBJC-15-正式协议_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象程序设计基础正式协议非正式协议和委托1目 录正式协议简介3 2应用实例3 3复制协议详解3 4补充说明3 5 自己不做,而委托他人来完成某项工作。 委托是一种对象,另一个类的对象会要求委托对象执行它的某些操作。即一个对象代替别的对象来完成某些任务,或者是和别的对象一起协调来完成某些工作。其中,委托者须持有对被委托者的引用,并在适当的时间发送消息给被委托者。 对象a需要完成某个操作dosometing(),但是a没有实现这个操作,而对象b实现了dosomething()这个操作,那么对象a可以委托对象b完成此操作。AB *b;Bdosomething委托者委托者被委托者被委托者例子:小孩

2、在树上摘下水果后会询问大人:“这个可以吃吗?”大人同意后才往嘴里放Baby:Mother:委托者委托者被委托者被委托者- (BOOL) tableView: (NSTableView *) tableView shouldSelectRow: (int) row; 委托强调类别的另一种应用:被发送给委托对象的方法可以声明为一个NSObject的类别。 创造一个NSObject类的类别称为“创建一个非正式协议”。因为基本所有的常用类都继承自NSObject类,所以我们可以在任何类中使用该类别实现的方法。interface NSObject(NSNetServiceBrowserDelegateM

3、ethods)- (void) netServiceBrowserWillSearch:(NSNetServiceBrowser *) browser;- (void) netServiceBrowser:(NSNetServiceBrowser *) aNetServiceBrowser didFindService: (NSNetService *) service moreComing: (BOOL) moreComing;- (void) netServiceBrowserDidStopSearch: (NSNetServiceBrowser *) browser;- (void) n

4、etServiceBrowser: (NSNetServiceBrowser *) browser didRemoveService: (NSNetService *) service moreComing: (BOOL) moreComing;end通过将这些方法声明为NSObject的类别,NSNetServiceBrowser的实现可以将这些消息之一发送给任何对象,无论这些对象实际上属于哪个类。这也意味着,只要对象实现了委托方法,任何类的对象都可以成为委托 -类类 方法方法: selector not recognizedCar *car = Car alloc init;if ( )

5、NSLog (yowza!);非正式协议是非正式协议是NSObjectNSObject的一个类别,的一个类别,它可以列出对象能够响应的方法。它可以列出对象能够响应的方法。非正式协议用于实现委托,非正式协议用于实现委托,委托是一种允许你轻松定制对象行为的技术。委托是一种允许你轻松定制对象行为的技术。非正式协议和委托1目 录正式协议简介3 2应用实例3 3复制协议详解3 4补充说明3 5/复制- end/编码- (void) encodeWithCoder: (NSCoder *) aCoder;- (id) initWithCoder: (NSCoder *) aDecoder;endinter

6、face Car : NSObject / instance variables/ methodsend / Carinterface Car : NSObject 非正式协议和委托1目 录正式协议简介3 2应用实例3 3复制协议详解3 4补充说明3 5#import protocol IDisplay -(void) show:(int)val; endIDisplay.h:#import #import IDisplay.hinterface CBaseDashboard : NSObject-(void) show:(int) val;end#import CBaseDashboard.

7、himplementation CBaseDashboard-(void) show:(int) val-(void)initif (self=super init) self autorelease;-(void)deallocNSLog(CBaseDashboard dealloc);endCBaseDashboard:#import CBaseDashboard.hinterface CEnglishDashboard : CBaseDashboard end#import CEnglishDashboard.himplementation CEnglishDashboard-(void

8、) show:(int) val NSLog(temperature:%d C,val);-(void)deallocNSLog( CEnglishDashboard dealloc);super dealloc;endCEnglishDashboard:#import CBaseDashboard.hinterface CChineseDashboard : CBaseDashboardend#import CChineseDashboard.himplementation CChineseDashboard-(void) show:(int) val NSLog(温度:温度:%d摄氏度摄氏

9、度,val);-(void)deallocNSLog(CChineseDashboard dealloc);super dealloc;endCChineseDashboard:id getDisplay(int flag)if (1=flag) return CChineseDashboard new;return CEnglishDashboard new;int main (int argc, const char * argv) NSAutoreleasePool * pool = NSAutoreleasePool alloc init;id ps=getDisplay(1);ps

10、show:100;ps=getDisplay(2);ps show:100;pool drain;return 0;用协议用协议来修饰变量,说明该变量需要来修饰变量,说明该变量需要遵循我们制定的这个遵循我们制定的这个协议协议非正式协议和委托1目 录正式协议简介3 2应用实例3 3复制协议详解3 4补充说明3 5interface Engine : NSObject end / Engine- (id) copyWithZone: (NSZone *) zoneEngine *engineCopy;engineCopy = self class allocWithZone: zone init;

11、return (engineCopy); / copyWithZoneEngine allocWithZone: zone;指向可供指向可供分配的内分配的内存区域存区域方法能让所有引擎的派生类正常工作 复制的对象需要自己管理内存释放interface Tire : NSObject float pressure;float treadDepth;/ . methodsend / Tire- (id) copyWithZone: (NSZone *) zoneTire *tireCopy;tireCopy = self class allocWithZone: zoneinitWithPress

12、ure: pressuretreadDepth: treadDepth;return (tireCopy); / copyWithZoneinterface AllWeatherRadial : Tirefloat rainHandling;float snowHandling;/ . methodsend / AllWeatherRadial- (id) copyWithZone: (NSZone *) zoneAllWeatherRadial *tireCopy;tireCopy = super copyWithZone: zone;tireCopy setRainHandling: ra

13、inHandling;tireCopy setSnowHandling: snowHandling;return (tireCopy); / copyWithZoneinterface Car : NSObject NSString *applellation; /名称名称NSMutableArray *tires;Engine *engine;/ . methodsend / Car- (id) copyWithZone: (NSZone *) zoneCar * carCopy;carCopy = self class allocWithZone: zone init;carCopy.na

14、me = ;Engine *engineCopy;engineCopy = engine copy autorelease;carCopy.engine = engineCopy;for (int i = 0; i 4; i+) Tire *tireCopy;tireCopy = self tireAtIndex: i copy;tireCopy autorelease;carCopy setTire: tireCopy atIndex: i;return (carCopy);/ copyWithZoneCar *car = Car alloc init; =

15、 Herbie;for (int i = 0; i 4; i+) AllWeatherRadial *tire;tire = AllWeatherRadial alloc init;car setTire: tire atIndex: i;tire release;Slant6 *engine = Slant6 alloc init;car.engine = engine;engine release;car print;Car *carCopy = car copy;carCopy print;car release;carCopy release;pool release;非正式协议和委托1目 录正式协议简介3 2应用实例3 3复制协议详解3 4补充说明3 5required表示必须实现的方法optional表示可选的实现 非正式协议是非正式协议是NSObject类的类别。这意味着几乎所有类的类别。这意味着几乎所有的对象都是非正式协议的采纳者。非正式协议中的方的对象都是非正式协议的采纳者。非正式协议中的方法不必全部实现。在调用某个方法之前,调用对象会法不必全部实现。在调用某个方法之前,调用对象会先检查目标对象是否实现此方法。非正式协议实质上先检查目标对象是否实现此方法。非正式协议实质上是是Foundation和和AppKit 类用于实现委托的方式。类用于实现委托的方式。

温馨提示

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

评论

0/150

提交评论