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