我很難選擇一個類是具體的還是抽象的。另外,我不完全知道層次結構中的哪一點會使事情變得具體或抽象。問題是,我們如何確定一個類應該是抽象類還是具體類?你怎麼知道什麼時候一個類應該是抽象的?
回答
一般來說,如果您完全沒有理由創建該類的實例,則該類應該是抽象的。例如,假設您有一個Shape類,它是Triangle,Square,Circle等的超類。由於「Shape」非常普遍,因此不應該有任何理由構造Shape對象,所以它應該是抽象的(或甚至可能是一個接口)。
所以可以肯定地說抽象類是一種我們感官無法感知的類。就像Shape只存在於_concept_而不是實際的對象一樣。 –
這聽起來很安全。例如,儘管可能有一個抽象類「Car」,其中包含「Truck」或「Jeep」等具體子類。 –
當所有子類都有一個共同的行爲時,應該有一個具體的方法。
例如,車輛是一個抽象類,然後它由燃料驅動。這將是所有車輛(自行車除外)的常見行爲 - 所以應該用具體的方法來描述,其他功能如班級(2輪車/ 4輪車),跑步細節(里程0-20/0-80),動力細節100cc-400cc)對於不同的車輛會有所不同,所以它應該抽象的方法。
抽象類意味着它是抽象的不完整。它需要另一個類來完成它和/或其功能。您需要擴展抽象類。
幾件事情要記住,當你選擇抽象類:
- 你想要的類不應該被實例化。
- 您想要繼承此類
- 該類不完整,並且繼承類必須完成其定義(通過重寫抽象類的抽象方法)。
把一個抽象類想象成一個普通類,其中一些方法將在後面定義。
例如,您想要訪問數據庫,但不知道將使用哪個數據庫。因此,您可以編寫打開連接的部分,啓動事務,訪問數據庫,關閉事務並釋放連接。但是,由於該部分是數據庫特定的,因此您將未實現獲取連接的部分。所以,例如,訪問MySQL的人會擴展你的類,並且只需要實現獲取連接的部分。
同意你的例子,不會使用它作爲一個更好的選擇接口? –
不,因爲該接口將無法保存示例的樣板代碼。 –
在我看來,抽象類和具體類之間唯一的區別是抽象類不能被「新」。
您可以在具體類之前放置一個抽象關鍵字來阻止其他人重新獲取此類的對象。 (抽象類不一定要有抽象方法)
我建議你用接口而不是抽象類,因爲Java是單繼承,一個類只能有一個超類但可以實現多接口。
一個抽象類是不錯的選擇:
- 如果你認爲你會使用繼承計劃,因爲它提供了一個共同的基類實現派生類
- 如果你希望能夠到宣佈非公開成員。
- 如果你認爲你需要當你想一些方法與定義來添加方法在未來
- - 這樣一個抽象類可以有實際的實施細則非抽象的方法。
- 但是請記住抽象類不能實例化。它只能用作擴展抽象類的其他類的超類。
- 1. 什麼是西格瑪剪裁?你怎麼知道什麼時候應用它?
- 2. 爲什麼你需要知道抽象類的抽象方法是否抽象
- 3. 什麼時候應該去接口,什麼時候去抽象類?
- 4. 你怎麼知道什麼時候在Python中關閉文件?
- 5. 不知道什麼時候使用抽象屬性,什麼時候不使用
- 6. 你怎麼知道你什麼時候需要單獨的表格?
- 7. 什麼時候你返回一個類,你什麼時候返回一個HttpResponseMessage?
- 8. 什麼時候去接口,什麼時候去抽象類
- 9. 給定一個包,我怎麼知道它的artifactId應該是什麼?
- 10. 在C#中,什麼時候應該使用一個結構,什麼時候應該使用一個類?
- 11. 什麼時候應該使用一個類,什麼時候應該使用一個id?
- 12. iPhone的UITextView - 你怎麼知道什麼時候你附加的文本是不可見的
- 13. 什麼時候應該使用抽象工廠模式
- 14. 什麼時候該類應該實現一個接口,什麼時候不應該接口?
- 15. node.js async.each回調,我怎麼知道它什麼時候完成?
- 16. 我怎麼知道什麼時候已經HTML完全呈現
- 17. Iphone CLLocationManager horizontalAccuracy更新。什麼時候?我怎麼知道它?
- 18. 我怎麼知道什麼時候不再點擊按鈕
- 19. 你怎麼知道主要的啓動活動是什麼?
- 20. 你怎麼知道一個函數是否返回一個值?
- 21. 一個人怎麼知道什麼時候在Clojure/Lisp中換行?
- 22. 我需要知道什麼時候應該使用wp_redirect()?
- 23. 我們什麼時候知道我們應該使用符號?
- 24. 什麼時候應該一個類實現一個接口?
- 25. 爲什麼ClassLoader是一個抽象類?
- 26. Firefox不知道該怎麼辦的時候,而建設一個URL
- 27. 有什麼方法可以知道什麼時候創建了一個對象?
- 28. 一個過程如何知道它是什麼時候背景?
- 29. 你怎麼知道一個NSObject是否有某個屬性?
- 30. 你什麼時候知道何時使用TreeSet或LinkedList?
如果您可以提供一個[最小示例](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 +到+使用+抽象類+ + +中爪哇)。 –