Java中的银行账户

时间:2017-03-02 15:37:23

标签: java inheritance

我需要对学校的继承概念做一些澄清。

我有一个名为Account的超级课程 使用属性:名称,acctNum和余额 使用方法:deposit()和withdraw()

另一个名为Saving的类是Account的子类 使用属性:interestRate(固定值为2%) 使用方法:interestPerYear()和methodB()

另一个名为FixedDeposit的类(这是我不确定的) 使用属性:interestRate(固定值为4%) 使用方法:interestPerYear()和methodB()

那么fixedDeposit类可以是Saving的子类,以便它可以继承2个方法interestPerYear()和methodB()吗?如果是这样,如何将用于fixedDeposit的interestRate值改为4%?

interestPerYear()由余额x interestRate计算。

感谢。

2 个答案:

答案 0 :(得分:0)

fixedDeposit不能是储蓄的子类,因为定期存款账户不是储蓄账户。处理超类和子类时,只有在子类可以与超类相关时才会扩展。我的教授给了我的课程类比。

你有超级车。所有车辆都有轮子。但是,你有汽车,卡车和摩托车。汽车不能延长卡车,因为汽车不是卡车。汽车还有子类轿车和SUV。 SUV不是摩托车,因此suv不能延伸摩托车。

我希望这个答案很有帮助,你现在对super / sub类有了更多的了解。

答案 1 :(得分:0)

  

那么fixedDeposit类可以是Saving [...]的子类吗?

答案主要取决于定期存款账户是否为某种储蓄账户。说实话,我不知道。根据您的描述,看起来固定存款账户可以扩展储蓄账户或通用账户。

  

如果是这样,如何将用于fixedDeposit的interestRate值改为4%?

有不同的方法。我将概述一些。

选项A

SavingFixedDeposit都成为Account的直接子类。我们可以如下建模:

public class Account {

    private String name;
    private int acctNum;
    private float balance;
    private float interestRate;

    public Account(int acctNum, String name) {
        this.acctNum = acctNum;
        this.name = name;
        this.balance = 0.0;
        this.interestRate = 0.0;
    }

    public float interestPerYear() {
        return balance * interestRate;
    }

    public void deposit(float amount) { /*...*/ }
    public void withdraw(float amount) { /*...*/ }
    public void methodB() { /*...*/ }
}

此处,Account以及SavingFixedDeposit所需的所有方法都已存在。这是有道理的,因为似乎interestPerYear()的公式总是相同的。根据构造函数中的Account,默认this.interestRate = 0.0;将没有利率。请注意,此行不是必需的,interestRate的声明会自动将其设置为0.0,这就是Java的工作原理(其他一些语言不是),但我喜欢明白。

现在开始其他课程:

public class Saving extends Account {

    public Saving(int acctNum, String name) {
        super(acctNum, name);
        this.interestRate = 2.0;
    }
}

public class FixedDeposit extends Account {

    public FixedDeposit(int acctNum, String name) {
        super(acctNum, name);
        this.interestRate = 4.0;
    }
}

super()调用(必须是您在构造函数中执行的第一件事)将执行Account的构造函数。我假设每个帐户都需要一个号码和名字。然后,我们将interestRate设置为帐户类型的特定金额。这就是全部。

选项B

您也可以将FixedDeposit扩展为Saving,并将其他所有内容保持不变:

public class FixedDeposit extends Saving {

    public FixedDeposit(int acctNum, String name) {
        super(acctNum, name);
        this.interestRate = 4.0;
    }
}

会发生interestRate首先设置为0.0(由于Account中的实施),然后调用super()将执行{{1}将Saving设置为interestRate,然后将2.0设置为FixedDeposit。但是,4.0的ctor会将其设置为interestRate。瞧。

选项C

另一种方式(以及我可能采用的方式)是在Account的ctor中添加public Account(int acctNum, String name, float interestRate) { this.acctNum = acctNum; this.name = name; this.balance = 0.0; this.interestRate = interestRate; } 作为参数,如下所示:

FixedDeposit

这样,Savingpublic Saving(int acctNum, String name) { super(acctNum, name, 2.0); // or 4.0 for FixedDeposit } 的ctors可以像这样编写:

Saving

选项D

我们可以通过完全放弃FixedDepositAccount类来进一步简化它,因为它们似乎现在无法添加任何内容。相反,您可以将Account saving = new Account(8172, "Jon Doe", 2.0); Account fixedD = new Account(8184, "Li Ping", 4.0); 类用于所有帐户:

public class GenerousAccount extends Account {

    public GenerousAccount(int acctNum, String name) {
        super(acctNum, name);
        this.interestRate = 6.0;
    }

    public float interestPerYear() {
        return balance * 2 * interestRate; // Twice as much! Yay!
    }

}

最后,只有你知道什么样的架构适合你的项目。

但是如果......

您可能想知道:"但如果有一种全新类型的帐户使用不同的利率公式呢?"

overriding 的用武之地。让我们坚持上面的选项A.然后我们可以像这样实现新类型的帐户:

interestPerYear()

在这里,我们实施Account,即使GenerousAccount中已存在GenerousAccount。这样做的是当你在Saving类型的对象上调用方法时,Java将执行它在FixedDeposit中找到的方法的版本,从而使利率加倍。相比之下,Accountcontainer_frame没有这样的方法,所以Java会上传继承链,直到找到这样的方法(它将在worker中执行)并使用它。

希望这有帮助。