[英]invoking interface method in abstract class method
该代码正在运行,但是我想更好地理解该主题,并且不确定如何命名该问题。 如果接口方法为空,在抽象类方法中如何调用接口方法? 谁能告诉我在Java中如何调用这种操作? 在我参加的大学课程中,幻灯片将问题命名为“通过API编程”,但我在Google上找不到任何东西。
我有一个具有getBalance方法的接口类:
public interface BankAccount {
int getBalance();
...
}
然后,我在抽象类方法中调用接口方法:
public abstract class AbstractBankAccount implements BankAccount {
private final bankAccountNo;
private int accountBalance;
abstractBankAccount(int bankAccountNo) {
this.bankAccountNo = bankAccountNo;
}
public void transferBalance(bankAccount account) {
// so here is what I am struggling to understand: account.getBalance() is called, but getBalance() method in interface is empty, how does it work then?
final int accountBal = account.getBalance();
if (accountBal < 0)
throw new IllegalArgumentException("not enough money on the account");
accountBalance += accountBal;
account.withdraw(accountBal);
}
}
在抽象类中,一些方法留给具体的继承者实现。
尽管该方法现在是空的(抽象的),但是当您创建一个非抽象的实现时,您必须为该方法提供一个主体。 该身体将被称为。
这是一个例子:
abstract class Parent {
abstract String someMethod();
public String getValue() {
return someMethod();//how could this work?! someMethod() has no body!
}
}
class Child extends Parent {
@Override
String someMethod() { //this won't compile unless I implement someMethod()
return "data";
}
}
尽管someMethod()在Parent中是抽象的,但是您实际上不能创建Parent的实例(因为它是抽象的)。 您必须扩展它,这需要您提供someMethod()的实现。
答案是,运行此命令时, account
参数将是实现bankAccount.getBalance()的具体类的实例。 这就是抽象的工作方式
在我参加的大学课程中,幻灯片将问题命名为“通过API编程”,但我在Google上找不到任何东西。
和
如果接口方法为空,在抽象类方法中如何调用接口方法?
在具体类的方法中,您可能会遇到完全相同的情况。
在这里,接口定义了一个contract:方法来实现,但是这些方法在接口中都是抽象的。
要通过接口进行编程,如果我们希望能够切换到该接口的另一个实现类,则操作接口(此处为BankAccount)中的概念的代码不应直接引用该接口的具体类,而应直接引用该接口本身。
这就是为什么使用BankAccount
类型作为参数定义public void transferBalance(BankAccount account)
的原因。
当然,一次必须选择并实例化一个具体的类,但是这是一次应指定的类。
执行转移的客户代码可以写成:
// I instantiate concrete classes but I refer interface as declared type.
BankAccount bankAcountDebitor = new ConcreteBankAccount();
BankAccount bankAcountCreditor = new ConcreteBankAccount();
// I invoke a method that takes as argument a type derived from the interface type
bankAcountDebitor.transferBalance(bankAcountCreditor);
这样,即使有一天我们切换到另一个具体的BankAccount
表示形式:
bankAcountDebitor.transferBalance(bankAcountCreditor);
由于该方法将接口类型作为参数,因此仍然可以正常编译。
所以你可以这样写:
BankAccount bankAcountDebitor = new ConcreteUniversalBankAccount();
BankAccount bankAcountCreditor = new ConcreteUniversalBankAccount();
bankAcountDebitor.transferBalance(bankAcountCreditor);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.