//
// main.m
// 对象作为参数的连续传递
// 方法的形参,当调用该方法的时候,接收了值,才会给该方法中的形参分配存储空间,
// 如果传进来了是对象的指针,就保存了对象的地址,也就是指向了那个对象
#import <Foundation/Foundation.h>
#pragma mark - 弹夹
//弹夹
//事物名称: 弹夹(Clip)
//属性:子弹(Bullet)
//行为:上子弹(addBullet)
@interface Clip : NSObject
{
@public
int _bullet; // 子弹的数量
}
- (void)addBullet;
@end
@implementation Clip
- (void)addBullet{
_bullet=10;
}
@end
#pragma mark - 枪
//枪
//事物名称:枪(Gun)
//属性:弹夹(clip) , 型号(model)
//行为:上弹夹(addClip),射击
@interface Gun : NSObject
{
@public
Clip *_clip;
int _model;
}
- (void)addClip:(Clip*)mClip; // 枪可以接收一个弹夹
- (void)shoot:(Clip*)mClip; // 枪可以射击,没射击一次,弹夹的子弹数减1
@end
@implementation Gun
- (void)addClip:(Clip *)mClip{
_clip=mClip;
}
- (void)shoot:(Clip *)mClip{
if (mClip->_bullet>0) {
NSLog(@"射击了一次,还剩%i个子弹",--mClip->_bullet);
}else{
NSLog(@"没有子弹了,该换弹夹了");
}
}
@end
#pragma mark - 士兵
//士兵
//事物名称: 士兵(Soldier)
//属性:姓名(name), 身高(height), 体重(weight)
//行为:打枪(fire), 打电话(callPhone)
//
@interface Slodier : NSObject
{
@public
NSString *_name;
int _height;
int _weight;
}
- (void)fire:(Gun*)mGun and:(Clip*)mClip;
- (void)changeClip:(Gun*)mGun and:(Clip *)mClip;
- (void)call;
@end
@implementation Slodier
- (void)fire:(Gun *)mGun and:(Clip *)mClip{
[mGun shoot:mClip];
}
- (void)changeClip:(Gun*)mGun and:(Clip *)mClip{
[mGun addClip:mClip];
}
-(void)call{
NSLog(@"士兵打电话了");
}
@end
int main(int argc, const char * argv[]) {
// 给士兵一个枪,拿到一个弹夹,调用枪的上弹夹的功能,然后射击
//创建一个弹夹
Clip *pc=[Clip new];
// 初始化弹夹对象
pc->_bullet=5;
//创建一个枪对象
Gun *pg=[Gun new];
// 初始化枪对象
pg->_clip=pc;
pg->_model=47;
// 创建一个士兵对象
Slodier *ps=[Slodier new];
// 初始化士兵对象
ps->_name=@"大兵瑞恩";
ps->_height=190;
ps->_weight=100;
[ps fire:pg and:pc];
[ps fire:pg and:pc];
[ps fire:pg and:pc];
[ps fire:pg and:pc];
[ps fire:pg and:pc];
[ps fire:pg and:pc];
// 创建一个新的弹夹
Clip *newPc = [Clip new];
// 初始化这个新的弹夹
newPc->_bullet=5;
// 士兵会换弹夹,会调用枪的换弹夹功能换
[ps changeClip:pg and:newPc];
// 继续射击
NSLog(@"更换弹夹之后,继续射击");
[ps fire:pg and:newPc];
return 0;
}