如何实现抽象与继承类的交互?

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 方法必须被覆盖以抛出异常。 可能值得覆盖 transferaddMoney 来验证类似于 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原则。

此外,为简洁起见,示例中使用了运行时异常。