如何在对象列表中定位指定账户并实现银行存款功能
解决存款总是存入第一个银行账户的问题
看起来你遇到的核心问题是没有正确定位到客户的目标账户实例,反而每次都新建了无关的账户对象,还错误地用余额当作索引去获取账户,这才导致存款总是跑到第一个账户去。咱们一步步拆解问题,然后给出修复方案:
问题代码的核心错误
调用端错误:新建了无关的账户对象
你在点击存款时,代码里new SavingsAccount()创建了一个全新的储蓄账户,这个账户和当前选中客户的账户列表没有任何关系,完全是个独立的对象。DepositMoney方法逻辑完全错误
方法里又new SavingsAccount()了一次,然后用savingsaccount.Balance(新对象的余额默认是0)作为索引去取客户的账户列表,这就相当于每次都取validCustomer.myBankAccount[0],自然总是存到第一个账户里。而且你最后把修改后的对象再赋值回列表的对应索引,这完全是多余的操作。
修复后的代码实现
第一步:修改调用端代码,定位到客户的目标账户
我们不需要新建账户,而是从选中客户的账户列表里找到对应类型的账户实例:
validCustomer = (Customer)lstBankKunder.SelectedItem; if (radioButtonSaving.IsChecked == true) { // 从客户的账户列表中筛选出储蓄账户 var targetAccount = validCustomer.myBankAccount.OfType<SavingsAccount>().FirstOrDefault(); if (targetAccount != null) { // 直接调用该账户的存款方法 targetAccount.DepositMoney(299); // 刷新账户列表显示 lstKonton.ItemsSource = null; lstKonton.ItemsSource = validCustomer.myBankAccount; } else { // 处理客户没有该类型账户的情况,比如弹窗提示 MessageBox.Show("该客户没有储蓄账户"); } }
第二步:简化DepositMoney方法逻辑
因为我们已经拿到了客户的目标账户实例,所以方法里不需要再传Customer参数,直接修改当前实例的余额即可:
// 假设你的SavingsAccount继承自一个BankAccount基类,基类里有Balance属性 public override void DepositMoney(int money) { this.Balance += money; // 直接修改当前账户的余额,无需额外操作 }
额外优化建议
- 如果客户可能拥有多个同类型账户(比如多个储蓄账户),那仅靠单选按钮区分类型就不够了,建议让用户直接从账户列表中选中具体要存款的账户,这样更准确。
- 给所有账户类定义一个统一的基类(比如
BankAccount),包含通用的属性(如Balance)和方法(如DepositMoney、WithdrawMoney),这样myBankAccount可以定义为List<BankAccount>,便于统一管理和操作。 - 可以给每个账户添加一个
AccountName或AccountType属性,方便在界面上显示区分不同账户。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

