簡體   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