繁体   English   中英

在抽象类方法中调用接口方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM