【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这个指针。