2014-07-03 92 views
2

我很難選擇一個類是具體的還是抽象的。另外,我不完全知道層次結構中的哪一點會使事情變得具體或抽象。問題是,我們如何確定一個類應該是抽象類還是具體類?你怎麼知道什麼時候一個類應該是抽象的?

+0

如果您可以提供一個[最小示例](http://stackoverflow.com/help/mcve),那將會很好,如果您想要一般答案,請參見第一個結果(https:// www.google.co.in/search?q=when+to+use+abstract+class&aq=f&oq=when+to+use+abstract+class&aqs=chrome.0.57j0l3j62l2.6617j0&sourceid=chrome&ie=UTF-8#q=when +到+使用+抽象類+ + +中爪哇)。 –

回答

3

一般來說,如果您完全沒有理由創建該類的實例,則該類應該是抽象的。例如,假設您有一個Shape類,它是Triangle,Square,Circle等的超類。由於「Shape」非常普遍,因此不應該有任何理由構造Shape對象,所以它應該是抽象的(或甚至可能是一個接口)。

+0

所以可以肯定地說抽象類是一種我們感官無法感知的類。就像Shape只存在於_concept_而不是實際的對象一樣。 –

+0

這聽起來很安全。例如,儘管可能有一個抽象類「Car」,其中包含「Truck」或「Jeep」等具體子類。 –

0

當所有子類都有一個共同的行爲時,應該有一個具體的方法。

例如,車輛是一個抽象類,然後它由燃料驅動。這將是所有車輛(自行車除外)的常見行爲 - 所以應該用具體的方法來描述,其他功能如班級(2輪車/ 4輪車),跑步細節(里程0-20/0-80),動力細節100cc-400cc)對於不同的車輛會有所不同,所以它應該抽象的方法。

1

抽象類意味着它是抽象的不完整。它需要另一個類來完成它和/或其功能。您需要擴展抽象類。

幾件事情要記住,當你選擇抽象類:

  • 你想要的類不應該被實例化。
  • 您想要繼承此類
  • 該類不完整,並且繼承類必須完成其定義(通過重寫抽象類的抽象方法)。
1

把一個抽象類想象成一個普通類,其中一些方法將在後面定義。

例如,您想要訪問數據庫,但不知道將使用哪個數據庫。因此,您可以編寫打開連接的部分,啓動事務,訪問數據庫,關閉事務並釋放連接。但是,由於該部分是數據庫特定的,因此您將未實現獲取連接的部分。所以,例如,訪問MySQL的人會擴展你的類,並且只需要實現獲取連接的部分。

+0

同意你的例子,不會使用它作爲一個更好的選擇接口? –

+0

不,因爲該接口將無法保存示例的樣板代碼。 –

0

在我看來,抽象類和具體類之間唯一的區別是抽象類不能被「新」。

您可以在具體類之前放置一個抽象關鍵字來阻止其他人重新獲取此類的對象。 (抽象類不一定要有抽象方法)

我建議你用接口而不是抽象類,因爲Java是單繼承,一個類只能有一個超類但可以實現多接口。

0

一個抽象類是不錯的選擇:

  1. 如果你認爲你會使用繼承計劃,因爲它提供了一個共同的基類實現派生類
  2. 如果你希望能夠到宣佈非公開成員。
  3. 如果你認爲你需要當你想一些方法與定義來添加方法在未來
  4. - 這樣一個抽象類可以有實際的實施細則非抽象的方法。
  5. 但是請記住抽象類不能實例化。它只能用作擴展抽象類的其他類的超類。
相關問題