如果一个方法是在一个超类中定义的,那么如何根据调用它的对象来更改结果



我有一个名为BankAccount的类(定义为抽象类),它是我的超级类,还有两个名为SavingsAccount和CheckingAccount的子类。

他们都使用BankAccount中定义的提款方法,但CheckingAccount可以透支,而SavingsAccount不能透支。

我的问题是,如果在BankAccount构造函数中,我们包含了以下内容:

public BankAccount(double balanceIn, double withdrawIn)
{
balance = balanceIn;
withdraw = withdrawIn;
}  

可以通过以下方式从SavingsAccount类调用:

public SavingsAccount(double balanceIn, double withdrawIn)
{
// initialise instance variables
super (balanceIn, withdrawIn);
}

是否有一种方法可以根据是从CheckingAccount还是SavingsAccount类调用构造函数来更改方法的响应方式

例如(这只是为了阐明而不是真实的代码,但是BankAccount类中定义的方法本质上就是这样做的)

public void setWithdraw(double withdrawIn)
{
withdraw = withdrawIn;

if (withdrawIn is called from savingsAccount && balance < withdrawIn)
{
System.out.print("You have insufficient funds");
}
else 
{
balance = balance - withdrawIn;
System.out.print("Funds Withdrawn"); 
}
}

我之所以这么问,是因为经过一些研究,我发现你不能覆盖子类中超级类的参数,所以我想知道这是怎么做到的。SavingsAccount类会有自己的属性等,出于清晰的原因(如果你想知道的话),我省略了这些属性。

我知道只在CheckingAccount中放一个提款方法,在SavingsAccount中放另一个会简单得多,但由于他们都提取资金,我想看看是否有可能在超级类中使用它。

您可以使用方法的覆盖:

public class BankAccount {
public BankAccount(double balanceIn, double withdrawIn) {
balance = balanceIn;
setWithdrawn(withdrawIn);
}
protected void setWithdrawn(double withdrawIn) {
// do the base stuff like withdraw = withdrawIn;
}
}

第二类:

public class SavingsAccount extends BankAccount {
public BankAccount(double balanceIn, double withdrawIn) {
super(balanceIn, withdrawIn);
}
// overwrite setWithdrawn
@Override
protected void setWithdrawn(double withdrawIn) {
// do the specific stuff like the code of setWithdrawn in your post 
}
}

是的,但有点古怪。无论如何你都不应该。正如PM 77在评论中所说,"你的家长班不应该对孩子们一无所知。"你最好有一个真正的ODD解决方案。

子类特有的所有行为都应该放在该子类中。子类之间共享的所有行为(如果有的话)都应该在超类中。如果子类之间没有共享任何行为(除了方法签名),那么超类应该是interfaceabstract

您需要的是以下内容之一:

  1. 在超类中声明方法,但在子类中定义它您可以通过将超类设置为interfaceabstract(甚至只设置一个方法abstract),然后覆盖子类中的方法来定义它来实现这一点。这种方法的好处是确保每个子类都有方法(这是架构的OOD契约),但行为对子类是唯一的。如果超类永远不会被直接实例化(只有子类会被实例化),那么这种方法是合适的
  2. 在超类中放置共享行为,在每个子类中放置不同的行为让subclass的方法调用superclass的方法来获得共享行为,然后直接在subclass方法中执行不同的行为。使用super访问超类方法(语法与this类似)。这种方法的好处是将共享功能模块化,但仍然允许每个子类向方法添加唯一的行为。这种方法最适合构造函数,但可以与任何方法一起使用
  3. 覆盖子类中的方法换句话说,在子类中定义一个具有完全相同签名但行为不同的方法。因此,子类的方法将"覆盖"超类的方法,允许您为每个子类指定唯一的行为。这种方法的好处是允许超类仍然被直接实例化并调用其方法,同时也允许每个子类具有唯一的行为。这种方法适用于非构造函数方法

最新更新