从班级到家长班级沟通?

时间:2016-05-14 09:37:00

标签: ios objective-c

我的应用中有一个Account课程,这是一个用户的银行帐户。这会初始化两个名为WithdrawalsDeposits的类。它们看起来像这样:

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]。解决这个问题的最佳方法是什么?

2 个答案:

答案 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实例中删除*,使其成为一个简单的整数值而不是指针。