【问题标题】:How to make 2 object instances communicate using a bank account number property?如何使用银行帐号属性使 2 个对象实例进行通信?
【发布时间】:2020-02-04 16:45:32
【问题描述】:

我是一个修补课程的初学者。

我正在尝试创建 2 个单独的银行实例,并让它们使用其中一个属性进行通信。该属性是银行帐号。

一个银行实例旨在能够使用其银行帐号作为一种验证形式将一定数量的资金转移到另一个银行实例。

在展示代码之前,请理解我是在这里实验和学习的。我知道 Bank 类不应该扩展 BankAccount 类。

看看这段代码:

class BankAccount{
        constructor(balance)
        {
                this.balance;
        }
        withdraw(amount)
        {
                this.balance -= amount;
        }
        deposit(amount)
        {
                this.balance += amount;
        }
}

class Bank extends BankAccount{
        constructor(balance,accNum)
        {
                super(balance);
                this.accNum = accNum;
        }
        transfer(fromAccNum,toAccNum,amount)
        {
                if(this.accNum === fromAccNum)
                        super.withdraw(amount);
                toAccNum.BankAccount.deposit(amount);
        }
}

BankAccount 类只包含一个余额和两个在提款或存款时更新余额的方法。

Bank 类添加了一个额外的属性,即银行帐号,这就是让这个挑战变得有趣的原因。

假设我要像这样创建 Bank 类的两个实例:

var acc01 = new Bank(10000,12345); // a balance of 10 000 and account number 12345
var acc02 = new Bank(1000,54321); // a balance of 1000 and a account number 54321

使用这两个单独的帐户,我想调用 transfer 方法并让它从 acc01 向 acc02 汇款。

类似这样的:

acc01.transfer(acc01.accNum,acc02.accNum,1000);

上面的行简单地传入 accNum 12345 作为第一个参数,这是我们要提取的帐号并发送到另一个帐号 54321。第二个参数 54321 是我们要发送的帐号钱到。第三个参数是我们想要发送的金额。

在 acc01 上调用 transfer 方法后的预期结果:

console.log(acc01.balance); // balance should be updated to 9000
console.log(acc02.balance); // balance should be updated to 2000

我似乎无法弄清楚如何进行这项工作!有人可以在这里救我吗?

【问题讨论】:

  • 我认为您面临的问题源于一个奇怪的设计决策 - Bank extends BankAccount 这是不寻常,尤其是当您将其与现实世界进行比较时。当然每个银行很多银行账户,关系不是银行银行账户。我认为你把你们的关系设置错了。当你用简单的英语表达关系时,请记住经验法则,“is a”关系表示继承,而“has a”表示它是对象中的一个字段。
  • 所以,同样,IRL,你并没有真正将钱从一个帐户直接转移到另一个帐户,你基本上是对银行说“移动X 从银行账户 A 到银行账户 B 的金额”,因此您应该有某种实体来管理此转账。

标签: javascript class


【解决方案1】:

我认为您的问题是 transfer 方法除了有自己的账户号码外,还接受“from”和“to”。这意味着在某些情况下,会在完全不相关的帐户上调用 transfer 方法。

你想重构它

    transfer(toAcc,amount)
        {
                super.withdraw(amount);
                toAcc.deposit(amount);
        }

另外请注意,您需要实际的账户实例,而不仅仅是账户编号,因为您没有基于账户编号检索银行账户对象的机制。

【讨论】:

    【解决方案2】:

    您可以拥有一个 BankManager 类来保存银行实例并管理交易。

    class BankManager{
        constructor()
        {
           this.accounts = [
               new Bank(10000, 12345),
               new Bank(1000, 54321)
           ];
        }
        transfer(toAcc, fromAcc, amount)
        {
           if (fromAcc.balance >= amount) {
               fromAcc.withdraw(amount);
               toAcc.deposit(amount);
           }
        }
        transferByNum(toAccNum, fromAccNum, amount)
        {
           const toAcc = this.accounts.find(acc => acc.accNum === toAccNum);
           const fromAcc = this.accounts.find(acc => acc.fromAcc === fromAccNum);
           this.transfer(toAcc, fromAcc, amount);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-12
      • 2012-09-27
      • 2020-05-09
      • 2015-11-29
      • 1970-01-01
      • 2016-04-24
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多