一、对象和方法的关系
1.对象可以作为方法的参数
小明用iPad 迷你看电影
代码实现:
#import <Foundation/Foundation.h>
@interface Ipad : NSObject
{
@public
NSString *_typeNum;
}
@end
@implementation Ipad
@end
@interface Person : NSObject
{
@public
NSString *_name;
}
-(void)seeMovie:(Ipad *) ipad;
@end
@implementation Person
-(void)seeMovie:(Ipad *)ipad{
NSLog(@"%@用%@看电影",_name,ipad->_typeNum);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Ipad *i = [Ipad new];
Person *p = [Person new];
i->_typeNum = @"Ipad Mini";
p->_name = @"小明";
[p seeMovie:i]; //小明用Ipad Mini看电影
}
return 0;
}
2.对象可以作为方法的返回值
母鸡下蛋
代码实现:
#import <Foundation/Foundation.h>
@interface Egg : NSObject
{
@public
float _weight;
}
@end
@implementation Egg
@end
@interface Hen : NSObject
{
@public
NSString *_name;
}
-(Egg *)lay:(float)weight;
@end
@implementation Hen
-(Egg *)lay:(float)weight{
Egg *e = [Egg new];
e->_weight = weight;
return e;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Hen *hen = [Hen new];
hen->_name = @"Tim";
Egg *egg = [hen lay:20.50f];
NSLog(@"母鸡%@下了一个%.2fg的蛋",hen->_name,egg->_weight);
//母鸡Tim下了一个20.50g的蛋
}
return 0;
}
二、对象最为方法的参数连续传递
具体问题:士兵用枪射击。
士兵类:
属性:年龄、姓名
方法:开枪
枪类:
属性:型号
方法:射击
弹夹类:
属性:子弹口径,子弹数量
代码:
#import <Foundation/Foundation.h>
#pragma mark 弹夹类
@interface BulletBox:NSObject
{
@public
NSString *_size;
int _bulletCount;
}
@end
@implementation BulletBox
@end
#pragma mark 枪类
@interface Gun:NSObject
{
@public
NSString *_size;
}
-(void) shoot:(BulletBox *)bulletbox;
@end
@implementation Gun
-(void) shoot:(BulletBox *)bulletbox{
if(bulletbox->_bulletCount>0){
bulletbox->_bulletCount--;
NSLog(@"\n开枪射击,嘭...(枪的型号:%@,子弹口径:%@,剩余子弹:%d)",_size,bulletbox->_size,bulletbox->_bulletCount);
}else{
NSLog(@"\n没有子弹了,请更换弹夹!!");
}
}
@end
#pragma mark 士兵类
@interface Soldier:NSObject
{
@public
NSString *_name;
int _life;
}
-(void) fire:(Gun *)gun and:(BulletBox *)bulletbox;
@end
@implementation Soldier
-(void) fire:(Gun *)gun and:(BulletBox *)bulletbox{
[gun shoot:bulletbox];
}
@end
#pragma mark -
int main(int argc, const char * argv[]) {
@autoreleasepool {
//实例化弹夹
BulletBox *bulletbox = [BulletBox new];
bulletbox->_size = @"0.5mm";
bulletbox->_bulletCount = 5;
//实例化枪
Gun *gun = [Gun new];
gun->_size = @"AK47";
//实例化士兵
Soldier *soldier = [Soldier new];
soldier->_name = @"卫龙";
soldier->_life = 100;
//连开7枪
[soldier fire:gun and:bulletbox];
[soldier fire:gun and:bulletbox];
[soldier fire:gun and:bulletbox];
[soldier fire:gun and:bulletbox];
[soldier fire:gun and:bulletbox];
[soldier fire:gun and:bulletbox];
[soldier fire:gun and:bulletbox];
}
return 0;
}
运行结果:
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:4)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:3)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:2)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:1)
开枪射击,嘭…(枪的型号:AK47,子弹口径:0.5mm,剩余子弹:0)
没有子弹了,请更换弹夹!!
没有子弹了,请更换弹夹!!
分析:弹夹类作为参数首先通过枪类的shot方法传入,然后再通过士兵类的fire方法传入士兵类。弹夹类对象作为函数的参数实现了连续传递。