2013-12-20 191 views
0

基於 this UML diagram基於UML圖的結果?

下列哪個表達式可用?

Boat boat1 = new Boat(); 
Boat boat2 = new Boat(Color.black, 300.2); 
Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1); 
Kayak kayak1 = new Kayak(Color.yellow, 30.2, 1, 1); 
Kayak kayak2 = new Kayak(); 
我有麻煩

,因爲我認爲,既然在Boat類,Color是私人所以Kayak的實例沒有與其相關聯的color。這是真的?

此外,Boat類是抽象的事實發揮作用,它是如何影響Kayak

最後,Boat類的實例是否與numSeats有關聯?

+0

它說什麼船是抽象的? – BevynQ

+1

船類是斜體 - 抽象的象徵。 – user3089390

回答

1

我會說這是這樣的:

Boat boat1 = new Boat(); // doesn't work, Boat is abstract 
Boat boat2 = new Boat(Color.black, 300.2);// doesn't work, Boat is abstract 
Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1); // ok 
Kayak kayak1 = new Kayak(Color.yellow, 30.2, 1, 1); // ok 
Kayak kayak2 = new Kayak(); // No such constructor 

我有麻煩,因爲我認爲既然在船類,顏色是私人所以皮艇的實例沒有顏色與之相關聯。這是真的?

不是真的,Kayak接受Color作爲PARAM,這樣的話就可以將它傳遞給Boat構造

而且,其中的事實船類是抽象的發揮作用,它是如何影響皮艇?

不,它是確定從抽象類派生,然後使用它作爲一個參考基準(即Boat x = new Kayak

1

這是純粹的面向對象,那麼請花太多時間去想它,直到你真的理解了這一點。

回答問題:

我有麻煩,因爲我認爲既然在船類,顏色是私人所以皮艇的實例沒有與其相關聯的顏色。這是真的?

不,這是錯誤的。根據UML,船有顏色。這個「財產」可以通過獲取者getColor和設定者setColor來看到。私人領域只是一個實施細節,這並不重要。正如Kayak延伸(派生自)船,可以說,皮划艇是一艘船。這就是所謂的分型。此外,Kayak繼承了Boat的代碼,因此也繼承了屬性的顏色。所以皮划艇也有一種顏色。

此外,船類是抽象的事實發揮作用,它如何影響皮划艇?

當擴展它時,超類是否抽象並不重要。重要的是:如果你的超類是抽象的包含抽象方法,而你的子類不是抽象的,那麼你的子類必須提供抽象方法的實現。

到目前爲止,您的Boat類中沒有抽象方法。所以對於延伸(皮艇延伸船)沒關係,船是抽象的。實際上,在考慮示例表達式時很重要。

最後,一個Boat類的實例是否有一個與它關聯的numSeats?

這個問題包含一個錯誤:不能有船類的instancs。僅僅因爲船類是抽象的。你不能創建抽象類的實例!

皮劃分類不是抽象的。因此您可以從中創建實例。皮艇實例有許多座位。但是,正如你可以讓其他班級擴展船隻那樣,沒有座位數量,你不能說所有的船隻都有一定數量的座位。

順便說一句:你能回答這個問題,哪些表達式是有效的?你能發表你的答案和理由嗎?

我想說前兩個將不起作用,因爲船是抽象的。第三和第四將工作,因爲皮划艇是一艘船,所以它可以設置爲具有獨木舟參數的船類,顯然皮划艇是皮划艇。最後一個不會工作,因爲沒有這樣的構造函數。

這個答案是正確的,但我們應該在你的措辭上工作。

,因此它可以與獨木舟小船類參數

皮艇不能「被設置爲船類」進行設置。讓我們考慮表達

Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1); 

您正在創建一個實例皮艇,調用Kayak的構造函數,顏色,雙,和兩個整數(順便說一句:這是唯一的構造函數)。然後,您將這個新的Kayak實例的引用分配給變量boat3,該變量是Boat類型的。請注意,我說的是這裏的類型,而不是類。正如我們之前提到的,皮划艇是一艘船,這項任務是正確的。

這個OOP概念被稱爲子類型多態性:一個類型爲Boat的變量可以引用任何船隻,所以它也是子類型。 (在這種情況下,它必須是子類型,因爲船是抽象的)

只是爲了澄清措辭:子類只是指擴展類的技術過程。這也意味着繼承超類的代碼。子類型意味着是一種關係(皮划艇是船),並且是亞型多態性的關鍵。在Java中,子類化總是也是子類型的。

+0

我想說前兩個將不起作用,因爲船是抽象的。 第三和第四將工作,因爲皮艇是一艘船,所以它可以設置爲皮艇參數的船類,顯然皮艇是皮艇。最後一個不會工作,因爲沒有這樣的構造函數。 – user3089390

+0

正確。另外三個? – Seelenvirtuose

+0

對不起,回來太快。 :) 那麼這是否意味着如果Boat中的weight屬性是私有的,但是有像setWeight或getWeight這樣的方法,它也可以被利用? – user3089390

2

只有兩個構造函數,將工作是:

Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1); 
Kayak kayak1 = new Kayak(Color.yellow, 30.2, 1, 1); 

皮艇將有與之相關聯的顏色,如果在構造一個超級呼叫到船的構造製成。

另外,哪裏船類是抽象的事實進入 玩,它是如何影響皮划艇?

沒有任何。這隻意味着你不能創建一個船的實例。

最後,是否有一個Boat類的實例有一個numSeats關聯 與它?

不。一艘船對numSeats一無所知。這是一個抽象的概念。它可以是衝浪板,也可以是遠洋班輪。