2016-04-12 220 views
0

比方說,我們已經有了內部類(代碼的其餘部分是不是真的很重要我猜,DataStructureIterator只是通過java.util.Iterator<Integer>擴展接口):Java接口VS類的返回類型

private class EvenIterator implements DataStructureIterator

現在我們要創建一個返回EvenIterator的新實例的方法。當我發現我們能做到以不同的方式:

  1. public EvenIterator getEvenIterator(){return new EvenIterator();}
  2. public DataStructureIterator getEvenIterator() {return new EvenIterator();}

我發現代碼的兩個版本編譯好,但我只是不能有什麼區別(如果有的話)和應該使用哪個版本。

+0

這是OOP的核心原理。你可以找到書籍,博客文章,視頻和更多的回答這個問題比你所希望的更詳細。嘗試搜索「多態性」。 – Sam

+0

@Sam我正在從oracle教程學習,多態部分還沒有,所以我分析的例子,我無法得到它。我會閱讀有關它,謝謝! – Kubekk

回答

1

這取決於。如果你的方法契約是你說你正在返回某種迭代器(即不是特定的實現),那麼返回接口。換句話說,你的合同說「除了迭代整數的能力之外,不要假設任何其他行爲/功能」。這樣做的好處是,您可以稍後將其他底層實現替換掉。呼叫者不要也不應該在意。另一方面,如果你的方法的合同是你返回一個迭代器,那麼特別是提供了只能遍歷甚至整數的能力,返回EvenIterator。這必然意味着你不能將實現交換出去(甚至不會迭代甚至整數),這樣做意味着打破/改變合同。您可以進一步抽象並自己製作一個接口,併爲迭代器提供不同的實現(可能是迭代一個內部鏈表,另一個遍歷內部數組,或者您可以提供迭代特定類型的偶數的能力;例如,2對冪或4的冪)。

+0

在這兩種情況下,return語句都是'new EvenIterator()'。將返回類型定義爲接口< - 是否意味着我們實際上不返回類,而只是從可以迭代的函數(類的方法)接口中刪除?作爲返回'新的EvenIterator()'我雖然返回類型必須是相同的,但如示例所示,它必須是接口,對嗎? – Kubekk

+0

接口返回類型是因爲'EvenIterator'實現接口。我不確定你的意思是「從功能(類的方法)中刪除」;實際的實例本身將被返回。只是從調用代碼的角度來看,如果返回類型是接口,那麼它不能假定更多關於返回值的內容,因爲那是方法的返回類型。例如,您不能調用僅在'EvenIterator'上定義的公共方法,因爲它不是接口的一部分。 –

+0

謝謝,那正是我的意思。我寫了一些代碼,實際上它就是這樣工作的。 – Kubekk