我的应用中有一个Account
课程,这是一个用户的银行帐户。这会初始化两个名为Withdrawals
和Deposits
的类。它们看起来像这样:
Account.h
@interface Account : NSObject
@property (nonatomic, copy) NSInteger *amount;
@property (nonatomic, strong) Withdrawal *withdrawal;
@property (nonatomic, strong) Deposit *deposit;
- (id)initWithAmount:(NSInteger *)amount;
- (Withdrawal *)withdrawal;
- (Deposit *)deposit;
@end
Account.m
@implementation Account
- (id)initWithAmount:(NSInteger *)amount {
self = [super init];
if (self)
{
_amount = amount;
_withdrawal = [[Withdrawal alloc] init];
_deposit = [[Deposit alloc] init];
}
return self;
}
- (Withdrawal *)withdrawal {
return _withdrawal;
}
- (Deposit *)deposit {
return _deposit;
}
@end
理想情况下,我希望能够致电[[account withdrawal] withdraw:50]
并更新[account amount]
。解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
首先,amount
不太可能具有类型NSInteger *
,即指向整数的指针,它更可能只是{{1>} 1}},这是一个整数。 NSInteger
的所有其他用途也是如此。这是因为NSInteger *
是值,而不是对象的引用,不像你说amount
属性返回对象的引用。
理想情况下,我希望能够致电
withdrawal
并更新[[account withdrawal] withdraw:50]
。解决这个问题的最佳方法是什么?
如果不对设计进行评论,如果您的提款对象需要访问您的帐户对象,那么它需要一种(获取方式)对它的引用。您应该考虑[account amount]
类在其关联的Withdrawal
的属性中,就像您的Account
具有其关联的Account
的属性一样。例如,您可以在创建Withdrawal
对象时设置此项,其中包含当前的对象:
Withdrawal
变为:
_withdrawal = [[Withdrawal alloc] init];
执行此操作可能会导致您创建一个循环 - 每个_withdrawal = [[Withdrawal alloc] initWithAccount:self];
实例引用一个Account
实例,该实例依次引用Withdrawal
实例。 Cycles 本身也不错,如果它们阻止收集不需要的对象,它们就会变坏。但是我怀疑您的Account
最终会使用Account
方法,您可以根据需要中断任何周期。
希望这会给你带走一些东西并继续努力。如果您发现您的设计/代码不起作用,请提出一个新问题,详细说明您的设计和代码。编码,你的问题是什么。
答案 1 :(得分:0)
这是一种组合关系,而非子级父组合关系。要获得实际剩余的帐户金额,您可以重写amount
的getter:
- (NSInteger)amount {
_amount = // set left amount, this value should come from Withdrawal class
return _amount;
}
顺便说一句,从NSInteger实例中删除*
,使其成为一个简单的整数值而不是指针。