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