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

taor4pac  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(307)

我有一个名为bankaccount的类(定义为abstract),它是我的超类和两个名为savingsaccount和checkingaccount的子类。
它们都使用bankaccount中定义的取款方法,但是checkingaccount可以透支,而as 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类调用构造函数来更改方法的响应方式
e、 g(这只是为了清楚地表达而不是真正的代码,但是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中分别使用一个取款方法要简单得多,但由于它们都取款,我想看看是否有可能在超级类中使用它。

ut6juiuv

ut6juiuv1#

可以使用方法重写:

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 
  }
}
0dxa2lsx

0dxa2lsx2#

是的,但有点不太对劲。反正你也不应该。正如pm77在他的评论中所说,“你的家长不应该知道任何关于孩子的事情。”你最好有一个真正奇怪的解决方案。
子类所特有的所有行为都应该包含在该子类中。子类之间共享的所有行为(如果有的话)都应该放在超类中。如果子类之间没有共享行为(方法签名除外),那么超类应该是 interface 或者 abstract .
您需要的是以下内容之一:
在超类中声明方法,但在子类中定义它。可以通过使超类成为 interface 或者 abstract (甚至只是一种方法 abstract ),然后重写子类中的方法以定义它。这种方法的好处是确保每个子类都有方法(这是体系结构的ood契约),但是行为对于子类是唯一的。如果超类永远不会被直接示例化(只有子类会被示例化),这种方法是合适的。
将共享行为放在超类中,并将不同的行为放在每个子类中。让子类'方法调用超类'方法来获得共享行为,然后直接在子类'方法中执行不同的行为。使用 super 访问超类方法(语法与 this ). 这种方法的优点是模块化共享功能,但仍然允许每个子类向方法中添加唯一的行为。这种方法最适合构造函数,但可以与任何方法一起使用。
重写子类中的方法。换句话说,在子类中定义一个具有完全相同的签名,但行为不同的方法。因此,subclass'方法将“重写”superclass'方法,允许您为每个子类指定唯一的行为。这种方法的好处是允许超类仍然被直接示例化并调用其方法,同时还允许每个子类具有唯一的行为。这种方法适用于非构造函数方法。

相关问题