我的初恋情人是何雨微:结网 ? 从 C 到 Objective C 入门2

来源:百度文库 编辑:中财网 时间:2024/05/09 03:10:39

从 C 到 Objective C 入门2

2009年6月14日 发表评论 阅读评论

在Objective C入门中我们了解了如何定义类,类的实现,以及调用类函数的方式。现在再来看一看关于类的高级概念。

id,动态绑定

#import #import "Bank.h" int main( int argc, const char *argv[] ) {Bank *bank1= [[Bank alloc] init];Bank *bank2= [[Bank alloc] init];id b; //可以把任何对象赋值给b [bank1 addAmount: 1];b = bank1;[b print]; //调用bank1的print函数b = bank2;[b print]; //调用bank2的print函数 // trueif ( [bank1 isMemberOfClass: [Bank class]] == YES ) {printf( "bank1是Bank类的一个对象\n" );} // trueif ( [bank1 respondsToSelector: @selector( addAmount: )] == YES ) {printf( "bank1响应addAmount:函数\n" );} // free memory[bank1 free];[b free]; return 0;}

id类型可以接受各种类型的对象,然后调用对应的函数。调用函数时,Objective C在编译的时候并不会检查该对象是否有该函数,需要开发人员自己确保调用的有效。另外Objective C也提供功能,在运行时检查某对象是否具有某函数。

类的高级使用:继承、类别、扮演、协议

////////////// BankMath.h#import "Bank.h"@interface Bank(Math) //为类Bank定义一个类别Math-(void) add: (int) b; //Math中的函数add-(void) sub: (int) b; //Math中的函数sub@end @protocol Auditable //定义一个协议-(void) audit; //其中包括一个函数audit的定义@end @interface ExBank: Bank //ExBank类继承Bank,同时实现Auditable协议-(void) print; //定义一个新的函数print,覆盖父类Bank中的print函数@end ////////////// 实现部分 BankMath.m#import "BankMath.h"@implementation Bank (Math) //Bank的类别Math的实现部分-(void) add: (int) f {amount ++;}-(void) sub: (int) f {amount --;}@end @implementation ExBank// 实现新定义的函数print-(void) print {printf("ExBank amount=%i", amount);}// 实现协议中包含的函数audit-(void) audit {printf("audit: amount=%i", amount);}@end ////////////// main.m#import  #import "Bank.h" int main( int argc, const char *argv[] ) {Bank *bank = [[Bank alloc] init];[bank add: 10]; //直接使用Bank对象类别Math中的函数[bank sub: 5]; //直接使用Bank对象类别Math中的函数[bank print]; [ExBank poseAsClass: [Bank class]]; //使用ExBank来扮演BankBank *bank2 = [[Bank alloc] init]; //对Bank的调用,就是对ExBank的调用[bank2 print]; //调用ExBank的print函数[bank2 audit]; //调用ExBank的audit函数 id auditable = bank2; //为auditable赋值bank2[auditable audit]; //调用bank2的函数audit//[auditable print]; //不行,因为Auditable类型中没有该函数 [bank free]; // 释放对象[bank2 free]; // 释放对象 return 0;}