2013-02-17 68 views
1

我在創建對象時遇到了一些困惑,我在java文檔和其他編程書籍中看到了這些對象。對於例如面向對象的設計:哪個更好?

假設有一個base classderived class

1-我有Base類型的變量,其是指類型的對象Derived

List<String> list = new ArrayList<String>(); 

2-我有Derived類型的變量,其指的是Derived的對象

ArrayList<String> arrList = new ArrayList<String>(); 

我的問題是在1和2之間進行選擇時應該如何思考?它是否利用了Polymorphism一般的基礎派生場景?

有沒有better practice,而選擇1和2,我不知道或只是一個personal decision

編輯:

對不起,列表是一個接口。 另一個問題:如果我使用Type參數,我的決定會改變嗎?

ArrayList<T> list = new ArrayList<T>(); 

更新答:這實際上被稱爲"Programming to the interface"。感謝Code-Guru。正是我一直在尋找簡單來說在回答這個問題的一個解釋 - What does it mean to "program to an interface"?

+2

選項1通常是首選(忽略抽象基類和接口之間的區別)。在OOP中,我們稱之爲「編程接口」。 – 2013-02-17 23:48:45

+0

對不起。請看另一個問題,編輯。 – Prince 2013-02-18 00:08:46

+1

我仍然建議你將'list'聲明爲'List '而不是'ArrayList '。更改爲類型參數不會顯着改變您的原始問題。 – 2013-02-18 00:47:04

回答

4
  1. List不是一個基類,它是一個interface,因此應該儘可能使用。

    使用類實現的接口允許您使用實現接口的所有類,而不僅僅是特定的類。

  2. String是一個具體的類,所以它直接使用它更清晰。

    然而,有時候,即使String實現了CharSequence接口,也沒有必要使用CharSequence,因爲它只是令人困惑。但是,請看StringBuilder,它幾乎全部使用CharSequence

總結 - 有沒有更好的只是適當

+0

所以1是可取的,但什麼時候適合使用案例2?請看我的另一個問題,編輯。 – Prince 2013-02-18 00:07:27

+0

@Prince - 當'CharSequence'只會複雜化時,使用'String'是合適的。 – OldCurmudgeon 2013-02-18 00:11:17

+0

我不明白你對'2'的解釋。它何時會令人困惑?我應該什麼時候使用'ArrayList'類? – Prince 2013-02-18 00:24:02

3

選擇基本類型允許您在將來某處使用ArrayList來表示LinkedList,而不更改其餘代碼。這爲您稍後重構提供了更大的靈活性。同樣,出於同樣的原因,您的公共方法應該返回一個List而不是特定類型的List實現 - 以便您可以更改您的內部實現來優化性能,而不會將合同中斷給調用方。

1

在列表是一個類的情況下(只是假設回答你的問題的目的 - 「我們將使用父類的對象,表示子類或類型派生類的使用對象(actula類)?」

1)你是對的,它只是爲了多態性的目的。

2)主要用於圍繞不同的類方法傳遞對象。其他類的方法可能會接受父類的輸入。你必須在這些地方使用鑄件。