如何实现抽象与继承类的交互?
How to implement the interaction among abstract and inherited classes?
我必须使用 @Override
方法实现抽象和继承 class 之间的交互。问题是我不知道该怎么做,这是我的任务:
我使用 3 种方法(pay(int amount)
、transfer(Account account, int amount)
、addMoney(int amount)
)创建了一个抽象的 class 帐户。付款必须看起来像普通的扣除。我覆盖了这些方法。每个人都必须有一个平衡。我不能从SavingsAccount
支付,只能转账加。它也不能下降到负面。 CreditAccount
不能 有正余额 - 如果我从它付款,它会下降到负数,到 return 0,我需要添加它。 CheckingAccount
实现了所有这些方法,但是 不能 下降到否定。
我必须创建 3 个帐户类型变量并给它们 3 种不同的帐户类型。代码来了:
public abstract class Account {
protected int amount;
protected int balance;
public Account(int amount, int balance) {
this.amount = amount;
this.balance = balance;
}
void pay(int amount) {
}
void transfer(Account account, int amount) {
}
void addMoney(int amount) {
}
}
public class CheckingAccount extends Account {
public CheckingAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
super.pay(amount);
}
@Override
void transfer(Account account, int amount) {
super.transfer(account, amount);
}
@Override
void addMoney(int amount) {
super.addMoney(amount);
}
}
public class CreditAccount extends Account {
public CreditAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
super.pay(amount);
}
@Override
void transfer(Account account, int amount) {
super.transfer(account, amount);
}
@Override
void addMoney(int amount) {
super.addMoney(amount);
}
}
public class SavingsAccount extends Account {
public SavingsAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void transfer(Account account, int amount) {
balance -= amount;
}
@Override
void addMoney(int amount) {
super.addMoney(amount);
}
}
看起来 base class 必须实现一些通用功能并且它没有任何抽象方法。所以它被标记为抽象以避免实例化。
而且似乎没有在帐户级别定义验证(金额是否应该为正)。
public abstract class Account {
protected int amount;
protected int balance;
public Account(int amount, int balance) {
this.amount = amount;
this.balance = balance;
}
void pay(int amount) {
if (amount > 0)
this.balance -= amount;
else
throw new IllegalArgumentException("Amount must be positive");
}
void transfer(Account recipient, int amount) {
recipient.addMoney(amount);
this.balance -= amount;
}
void addMoney(int amount) {
this.balance += amount;
}
}
然后 CheckingAccount
的实现需要覆盖方法来验证生成的余额:
public class CheckingAccount extends Account {
public CheckingAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
if (this.balance >= amount) {
super.pay(amount);
} else {
throw new IllegalArgumentException("Insufficient funds");
}
}
@Override
void transfer(Account recipient, int amount) {
if (this.balance - amount >= 0) {
super.transfer(recipient, amount);
} else {
throw new IllegalArgumentException("Insufficient funds for transfer from CheckingAccount");
}
}
@Override
void addMoney(int amount) {
if (this.balance + amount >= 0) {
super.addMoney(amount);
} else {
throw new IllegalArgumentException("Balance may not be negative for CheckingAccount");
}
}
}
对于 SavingsAccount
pay
方法必须被覆盖以抛出异常。
可能值得覆盖 transfer
和 addMoney
来验证类似于 CheckingAccount
.
的余额
public class SavingsAccount extends Account {
public SavingsAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
throw new RuntimeException("This method is not supported for Savings account");
}
}
最后一个 CreditAccount
你可能想检查余额是否为正,同时使用 pay
的默认实现(尽管信用账户也应该有信用额度):
public class CreditAccount extends Account {
public CreditAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void transfer(Account account, int amount) {
if (this.balance - amount <= 0) {
super.transfer(account, amount);
} else {
throw new IllegalArgumentException("Balance may not be positive for CreditAccount");
}
}
@Override
void addMoney(int amount) {
if (this.balance + amount <= 0) {
super.addMoney(amount);
} else {
throw new IllegalArgumentException("Balance may not be positive for CreditAccount");
}
}
}
这个例子只是为了符合上述要求来实现。
因此,与最初的class设计类似,不满足评论中提到的Liskov原则。
此外,为简洁起见,示例中使用了运行时异常。
我必须使用 @Override
方法实现抽象和继承 class 之间的交互。问题是我不知道该怎么做,这是我的任务:
我使用 3 种方法(pay(int amount)
、transfer(Account account, int amount)
、addMoney(int amount)
)创建了一个抽象的 class 帐户。付款必须看起来像普通的扣除。我覆盖了这些方法。每个人都必须有一个平衡。我不能从SavingsAccount
支付,只能转账加。它也不能下降到负面。 CreditAccount
不能 有正余额 - 如果我从它付款,它会下降到负数,到 return 0,我需要添加它。 CheckingAccount
实现了所有这些方法,但是 不能 下降到否定。
我必须创建 3 个帐户类型变量并给它们 3 种不同的帐户类型。代码来了:
public abstract class Account {
protected int amount;
protected int balance;
public Account(int amount, int balance) {
this.amount = amount;
this.balance = balance;
}
void pay(int amount) {
}
void transfer(Account account, int amount) {
}
void addMoney(int amount) {
}
}
public class CheckingAccount extends Account {
public CheckingAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
super.pay(amount);
}
@Override
void transfer(Account account, int amount) {
super.transfer(account, amount);
}
@Override
void addMoney(int amount) {
super.addMoney(amount);
}
}
public class CreditAccount extends Account {
public CreditAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
super.pay(amount);
}
@Override
void transfer(Account account, int amount) {
super.transfer(account, amount);
}
@Override
void addMoney(int amount) {
super.addMoney(amount);
}
}
public class SavingsAccount extends Account {
public SavingsAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void transfer(Account account, int amount) {
balance -= amount;
}
@Override
void addMoney(int amount) {
super.addMoney(amount);
}
}
看起来 base class 必须实现一些通用功能并且它没有任何抽象方法。所以它被标记为抽象以避免实例化。
而且似乎没有在帐户级别定义验证(金额是否应该为正)。
public abstract class Account {
protected int amount;
protected int balance;
public Account(int amount, int balance) {
this.amount = amount;
this.balance = balance;
}
void pay(int amount) {
if (amount > 0)
this.balance -= amount;
else
throw new IllegalArgumentException("Amount must be positive");
}
void transfer(Account recipient, int amount) {
recipient.addMoney(amount);
this.balance -= amount;
}
void addMoney(int amount) {
this.balance += amount;
}
}
然后 CheckingAccount
的实现需要覆盖方法来验证生成的余额:
public class CheckingAccount extends Account {
public CheckingAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
if (this.balance >= amount) {
super.pay(amount);
} else {
throw new IllegalArgumentException("Insufficient funds");
}
}
@Override
void transfer(Account recipient, int amount) {
if (this.balance - amount >= 0) {
super.transfer(recipient, amount);
} else {
throw new IllegalArgumentException("Insufficient funds for transfer from CheckingAccount");
}
}
@Override
void addMoney(int amount) {
if (this.balance + amount >= 0) {
super.addMoney(amount);
} else {
throw new IllegalArgumentException("Balance may not be negative for CheckingAccount");
}
}
}
对于 SavingsAccount
pay
方法必须被覆盖以抛出异常。
可能值得覆盖 transfer
和 addMoney
来验证类似于 CheckingAccount
.
public class SavingsAccount extends Account {
public SavingsAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void pay(int amount) {
throw new RuntimeException("This method is not supported for Savings account");
}
}
最后一个 CreditAccount
你可能想检查余额是否为正,同时使用 pay
的默认实现(尽管信用账户也应该有信用额度):
public class CreditAccount extends Account {
public CreditAccount(int amount, int balance) {
super(amount, balance);
}
@Override
void transfer(Account account, int amount) {
if (this.balance - amount <= 0) {
super.transfer(account, amount);
} else {
throw new IllegalArgumentException("Balance may not be positive for CreditAccount");
}
}
@Override
void addMoney(int amount) {
if (this.balance + amount <= 0) {
super.addMoney(amount);
} else {
throw new IllegalArgumentException("Balance may not be positive for CreditAccount");
}
}
}
这个例子只是为了符合上述要求来实现。
因此,与最初的class设计类似,不满足评论中提到的Liskov原则。
此外,为简洁起见,示例中使用了运行时异常。