2011-01-26 52 views
1

爲什麼我們要將實例分配給上層類的實例?做這件事的原因是什麼? 例如。爲什麼我們使用下面的代碼?爲上層類的實例分配實例

List lst = new LinkedList(); 

看來List是LinkedList的上層類。爲什麼我們需要使用上層類的'實例,而不是繼承類',LinkedList的實例。

另外,我還有一個問題。

我見過一些代碼,它將一個類的實例賦值給它的接口。爲什麼我們需要下面的例子?我知道,因爲我們不能生成接口的實例,所以它允許我們使用接口的一個實例。但是,使用接口實例有什麼意義?

Apple a = new Apple(); 
IFruit b = (IFruit) a; (IFruit is the interface of Apple) 

我希望我已經說清楚了。提前致謝。

+4

有點關於命名:你稱爲「上層類」的稱爲「超類」。順便說一下,在特定情況下,List是一個接口而不是一個類。另外'lst`不是'`List`實例「,它是」List`類型的變量「。 – 2011-01-26 12:47:22

+0

很高興認識這些,謝謝。 – 2011-01-26 12:51:12

回答

5

程序到接口(抽象)。

以後,如果你想代替的ArrayList到的LinkedList,你只需要改變一行代碼:

List lst = new LinkedList(); 
2
List lst = new LinkedList(); 

這裏List是一個接口,LinkedList是實現它。

它不是這裏的超類子類的情況。

List聲明瞭其實現者被強制執行的某些方法。 它會給你encapsulation的優勢。

2

使用接口(你所謂的上層階級),以抽象的點遠一些代碼中的細節。然後,您可以編寫更多通用代碼來處理您的數據類型界面。

以水果爲例,如果您有幾種不同類型的水果,那麼您可以編寫一個接受IFruit並通過任何類型水果的通用方法,並知道它將被正確處理。如果你沒有界面,那麼你必須爲每種需要處理的水果編寫一個方法。

1

這是'編程接口',它允許您交換實現而不影響其餘代碼。通過這種方式,您正在遵循Liskov Substitution Principle,這是SOLID原則(迄今爲止我最好的'OOP原則之一')之一,我強烈建議您熟悉這些原則。