2011-03-22 16 views
0

我正在閱讀Head First Design Patterns並在Java中有一些理解。它首先封裝一些與你的類不同的東西,然後把它們放在一個單獨的接口中,而不是把這些功能放在子類中。他們給出的例子是一個抽象的鴨子類,可以根據鴨子嘎嘎或飛翔。他們有一個呱呱和飛行接口(QuackBehavior和FlyBehavior接口),然後在其他類中實現這些接口。Java中行爲接口類型的引用變量

在這個例子中,他們有抽象類鴨如下

public abstract class Duck { 
    QuackBehavior quackBehavior; 
    FlyBehavior flyBehavior; 
..... 
} 

我猜是新的我是具有實例變量是接口類型。我從來沒有聽說過,但我認爲它是有效的?我想我更熟悉擁有一個具體類的實例變量。是否有類似這樣的類/接口的實例變量的規則?謝謝。

回答

0

是的,它是有效的。適用的唯一規則與適用於任何其他類型的規則相同;即你只能分配實現已聲明接口的東西。您可能在沒有意識到之前就已經看到甚至使用了類似的語法,例如:

List<String> list = new ArrayList<String>(); 
Serializable s = new Object(); 
0

如果您將字段聲明爲接口類型,則該字段將能夠容納實現該接口的任何類。

這是一個普通的領域。

2

這是有效的,而且是一種常見的做法。

實例變量是什麼並不重要。在可能的情況下甚至更喜歡使用接口。例如,總是定義List類型的變量,而不是ArrayList

否則您將如何能夠擁有不同的行爲?現在您可以將LowFlyBehaviourHighFlyBehaviour分配給該字段,因此Duck的不同實例可以具有不同的飛行行爲。如果該字段是這些具體類型中的任何一個,則這是不可能的。