【iOS开发之Objective-C】对象的交互

【iOS开发之Objective-C】对象的交互

1.问题

首先来看看生活中的一个常识:有两张银行卡,分别是卡A和卡B,现在卡A需要向卡B转账或是卡B需要向卡A转账。

第一步:我们先来找对象,对象是卡A和卡B两个;

第二步:我们来抽象出一个类,银行卡类;

第三部:分析类的属性和行为;这里我们只是简单列举一些。

属性:1.银行卡有银行的区别----银行,2.银行卡有账号----账号,3.银行卡有余额---余额。

行为:这里我们暂且认为这些行为都是银行卡的,1.存钱,2.取钱,3.显示余额,4.转账(我们假定转账是卡自己完成的)。

2.类的实现

下面我们就可以 开始来构造这个类了。

<pre name="code" class="objc">/*
 银行卡类:BankCard
 属性:
	1.卡号
	2.密码
	3.余额
 行为:
	1.存钱
	2.取钱
	3.显示余额
	4.转账
 */

 
#import <Foundation/Foundation.h>

@interface Bankcard : NSObject
{
	NSString * _bankName;  //银行名
	int _accountNum;       //账号
	int _money;            //余额
}
- (void) setBankName:(NSString *)name; //设置银行名
- (NSString *) getBankName; //获取银行名
- (void) setAccountNum:(int)num; //设置账户号
- (int) getAccountNum; //获取账户号
- (void) setMoney:(int)money;  //存钱
- (int) getMoney:(int)money;  //取钱
- (void) show;   //显示余额
- (void) giveMoneyTo:(Bankcard *)card withMoney:(int)money;
@end
下面来看银行卡BankCard这个类的具体实现:

#import "Bankcard.h"

@implementation Bankcard

- (void) setBankName:(NSString *)name{ //设置银行名
	_bankName = name;
}
- (NSString *) getBankName{ //获取银行名
	return _bankName;
}
- (void) setAccountNum:(int)num{ //设置账户号
	_accountNum = num;
}
- (int) getAccountNum{ //获取账户号
	return _accountNum;
}
//money是要存入的钱,_money是银行卡里面本来就有的
- (void)setMoney:(int)money{
	_money += money;//每次存钱进去 就是往银行卡里面已有的钱里面增加钱
}
- (int) getMoney:(int)money{ //取钱
	if (money > _money) {    // 当要取得钱大于卡内已有的钱时,提示余额不足
		NSLog(@"余额不足");
	}
	else{
		_money -= money;  //卡内还有的钱_money就是减去取得钱money后的数目
	}
	return money; //返回的是取钱的金额
}
- (void) show{  //哪个对象调用show方法,self就指向哪个对象
	NSLog(@"%@卡号为%d的卡的余额为:%d",[self getBankName],[self getAccountNum],_money); //显示余额
}
- (void) giveMoneyTo:(Bankcard *)card withMoney:(int)money{
	if (money < _money) {  //转账的数目需要小于自身有的数目
		NSLog(@"%@卡号为%d的卡向%@卡号%d的卡转账%d元。",[self getBankName],[self getAccountNum],[card getBankName],[card getAccountNum],money);
		[self getMoney:money];
		//哪个对象调用giveMoneyTo方法 self就是指向谁
		[card setMoney:money];//往需要转的目标卡里存钱
	}
	else NSLog(@"余额不足无法转账");
}
@end
最下面的一个方法

- (void) giveMoneyTo:(Bankcard *)card withMoney:(int)money

就是完成了对象的交互。这里有个关键词:self。关于self 是什么,我们先看完这个工程的输出。

下面主函数部分:代码的注释已经把每一步是做什么的写得比较清晰了我就不解释了。

#import <Foundation/Foundation.h>
#import "Bankcard.h"
int main(int argc, const char * argv[]) {
	@autoreleasepool {
		Bankcard * card1 = [[Bankcard alloc] init];  //新建一个card1的对象
		Bankcard * card2 = [[Bankcard alloc] init];  //新建一个card2的对象
		
		//给card1设置相关信息 中国银行 卡号11111  余额80
		[card1 setBankName:@"中国银行"];
		[card1 setAccountNum:11111];
		[card1 setMoney:100];
		[card1 show];  //显示card1转账前的余额
		
		//给card2设置相关信息  中国建设银行 卡号22222 余额200
		[card2 setBankName:@"中国建设银行"];
		[card2 setAccountNum:22222];
		[card2 setMoney:200];
		[card2 show];   <span style="font-family: Arial, Helvetica, sans-serif;">//显示card2转账前的余额</span>
		
		[card1 giveMoneyTo:card2 withMoney:50]; //card1向card2转账
		[card1 show];   //显示card1转账后的余额
		[card2 show];   //显示card2转账后的余额
	}
    return 0;
}

工程的输出是:

2015-07-21 20:11:19.288 对象之间的交互[3536:303] 中国银行卡号为11111的卡的余额为:100
2015-07-21 20:11:19.290 对象之间的交互[3536:303] 中国建设银行卡号为22222的卡的余额为:200
2015-07-21 20:11:19.292 对象之间的交互[3536:303] 中国银行卡号为11111的卡向中国建设银行卡号22222的卡转账50元。
2015-07-21 20:11:19.292 对象之间的交互[3536:303] 中国银行卡号为11111的卡的余额为:50
2015-07-21 20:11:19.293 对象之间的交互[3536:303] 中国建设银行卡号为22222的卡的余额为:250
Program ended with exit code: 0

card1中国银行卡里面原来有100块转账50给card2的中国建设银行,转账成功后card1中国银行卡里还有50元,card2中国建设银行卡里有250元了。


说了这么多,那么到底什么是对象的交互了。根据这个题意简单的说就是两个或多个属于同一个类的对象,它们之间完成数据的传递或是信息的传递。

3.self是什么呢?

我们在回头来看这个方法:

- (void) giveMoneyTo:(Bankcard *)card withMoney:(int)money{
	if (money < _money) {  //转账的数目需要小于自身有的数目
		NSLog(@"%@卡号为%d的卡向%@卡号%d的卡转账%d元。",[self getBankName],[self getAccountNum],[card getBankName],[card getAccountNum],money);
		[self getMoney:money];
		//哪个对象调用giveMoneyTo函数 self就是指向谁
		[card setMoney:money];//往需要转的目标卡里存钱
	}
	else NSLog(@"余额不足无法转账");
}
单从这个方法来看,我们还不知道到底是哪个卡向哪个卡转账,因为这里只有一个card的对象的参数还有一个关于转账金额的参数money。我们写这个方法是一个通用的方法,因为card1和card2都没调用这个方法,转账确实两个卡之间的事情,我们不能在card1向card2转账时把self用card1代替,也不能再card2向card1转账时把card2用self代替。这样写我们就需要两个关于card的参数,我们也不知道这里的:
if (money < _money) 
_money到底是谁的money。也许你要问了,这里我们用一个getMoney的方法不就得到了这里的_money了吗?那么当我们在调用这个方法的时候:

[card1 giveMoneyTo:card2 withMoney:50]; //card1向card2转账
是不是在方法giveMoneyTo后面有两个card的的对象了吗?一个card1一个card2。是不是觉得有些别扭。到底能不能我么实现这个方法,我没验证。

在OC中 

1 self是一个指针,在每一个方法中都有一个self指针;

2 self可以出现在所有的方法中(对象方法和类方法),不能在函数中;

3 self指向调用者。(谁调用它就指向谁);

4 可以使用self->成员变量 访问成员变量,可以使用[self 方法名]调用方法。

这里关于self的介绍就倒这里,在下一篇中我们还会用到self这个指针。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值