簡體   English   中英

函數返回接口意味着什么?

[英]What does it mean for a function to return an interface?

我剛剛看到了這樣的成員函數:

public Cat nextCat(GameState state); 

但是Cat是這樣的接口:

public interface Cat {
        void makeCat(GameState state);
}

因此,我對如何解釋這一點感到困惑。 我知道什么東西返回一個對象或原語。 但是返回接口意味着什么? 如何使用此函數的返回值?

考慮一下這種方式:如果Cat在常規類中,那么當您要在其上調用某些方法時,您究竟會關心什么?

您會關心方法定義:它們的名稱,它們的參數類型,它們的返回值。 不需要關心實際執行!

由於接口提供了所有這些功能,因此您可以像在常規類上一樣在其上調用方法。

當然,為了使該方法實際返回某個對象,需要在某個地方有一些實現該接口的類。 但是,實際上是什么類或如何實現這些方法與返回該對象的代碼無關緊要。

換句話說,您可以編寫如下代碼:

Cat cat = nextCat(GameState.STUFF);
cat.makeCat(GameState.OTHER_STUFF);

該代碼不了解實現Cat接口的具體類型,但是知道對象可以完成Cat接口所需的一切。

此函數返回實現Cat接口的類的對象。 只要為該類實現Cat接口的所有方法,實現細節(針對該具體類)就由您決定。

例如,您可以這樣做:

interface Cat {
    String meeeeow();
}

public Cat nextCat(GameState state) {
    return new Cat() {
        public String meeeeow() {
            return "meeeeeeeeeow!!!!";
        }
    };
}

在這種情況下,nextCat方法將通過“ anonymous-inner-class”返回Cat接口的實現。 這表明調用nextCat的代碼不需要知道哪個代碼實現了返回的Cat接口。 這是面向對象編程的主要優勢之一的示例:由於調用代碼不知道實現,因此以后更改實現的影響很小(只要接口保持不變)。

這是抽象的一種方法, "Hiding Actual implementation" ,最好的例子是Map接口,如果某個API的返回類型為Map ,則用戶實際上不需要關心對象實現的類型,即“哈希表Hasmap” ,借助Map接口中定義的方法,用戶可以對返回的對象執行操作,因為接口會與實現類建立契約,“實現類必須為聲明的方法提供定義”,否則將實現類聲明為abstract

這意味着成員函數可以返回任何實現。 這遵循“程序到接口,而不是實現”。 設計模式

方法可以不返回任何內容(無效),也可以不返回原始值int,double,...),也可以返回為null或引用實例的引用。 當方法返回引用時,它被聲明為返回對某種特定對象的引用。

在您的情況下,此方法返回的引用將為null或將引用其類實現Cat的對象

方法不返回接口 它們返回對實例(= object)或null (或原始值,但讓我們堅持使用對象)的引用 該引用通常存儲在變量中或用於調用實例方法或訪問實例成員。

聲明的返回類型告訴我們實際實例的最不特定類型,其引用由方法返回。 該引用后面的對象可能恰好是該類型或任何子類(或子子類,...)。

值得再次強調的是,擁有類型為接口的變量是完全合法的,而且實際上非常普遍,例如:

Measurable meas;  //"Measurable" is an interface name.


只需記住,meas引用的對象沒有類型為Measurable。
實際上,沒有對象具有可測量的類型。 相反,對象的類型是實現Measurable接口的某些類。 這可能是BankAccount類或Coin類或某些其他類的對象。

    meas = new BankAccount(1000); // OK 
    meas = new Coin(0.1, "dime"); // OK

假設您不知道該接口變量所引用的對象的類,該怎么辦?
您可以調用接口的方法:

double m = meas.getMeasure();

並且您還應該知道,在類和接口類型之間可能存在類型對話。

返回接口允許成員函數返回任何已實現類的引用。 它為接口編程提供了靈活性,並且有助於實現工廠和抽象工廠設計模式。

當您不需要了解實現時,可以返回接口以將實現留給該方法,而調用者可以僅使用該接口提供的方法。

Cat cat = nextCat(state);
cat.makeCat(state);

根據面向對象的定義,接口是一組具有空主體的相關方法。 接口在類和外部世界之間形成契約,並且該契約在編譯時由編譯器強制執行。 話雖這么說, nextCat(GameState state)返回一個接口Cat,這意味着在運行時它可以返回任何實現Cat的對象。 現在,那不靈活嗎? 只要對象遵守客戶期望的接口,客戶就不會意識到他們使用的特定類型的對象。

它返回一個實現接口的對象。 有一些示例可供參考: https : //blog.csdn.net/hduxiejun/article/details/52853153

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM