我需要对学校的继承概念做一些澄清。
我有一个名为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计算。
感谢。
答案 0 :(得分:0)
fixedDeposit不能是储蓄的子类,因为定期存款账户不是储蓄账户。处理超类和子类时,只有在子类可以与超类相关时才会扩展。我的教授给了我的课程类比。
你有超级车。所有车辆都有轮子。但是,你有汽车,卡车和摩托车。汽车不能延长卡车,因为汽车不是卡车。汽车还有子类轿车和SUV。 SUV不是摩托车,因此suv不能延伸摩托车。
我希望这个答案很有帮助,你现在对super / sub类有了更多的了解。
答案 1 :(得分:0)
那么fixedDeposit类可以是Saving [...]的子类吗?
答案主要取决于定期存款账户是否为某种储蓄账户。说实话,我不知道。根据您的描述,看起来固定存款账户可以扩展储蓄账户或通用账户。
如果是这样,如何将用于fixedDeposit的interestRate值改为4%?
有不同的方法。我将概述一些。
让Saving
和FixedDeposit
都成为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
以及Saving
和FixedDeposit
所需的所有方法都已存在。这是有道理的,因为似乎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
设置为帐户类型的特定金额。这就是全部。
您也可以将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
。瞧。
另一种方式(以及我可能采用的方式)是在Account
的ctor中添加public Account(int acctNum, String name, float interestRate) {
this.acctNum = acctNum;
this.name = name;
this.balance = 0.0;
this.interestRate = interestRate;
}
作为参数,如下所示:
FixedDeposit
这样,Saving
和public Saving(int acctNum, String name) {
super(acctNum, name, 2.0); // or 4.0 for FixedDeposit
}
的ctors可以像这样编写:
Saving
我们可以通过完全放弃FixedDeposit
和Account
类来进一步简化它,因为它们似乎现在无法添加任何内容。相反,您可以将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
中找到的方法的版本,从而使利率加倍。相比之下,Account
和container_frame
没有这样的方法,所以Java会上传继承链,直到找到这样的方法(它将在worker
中执行)并使用它。
希望这有帮助。