回答
這一切都取決於它是否很有意義的類的實例。
假設您例如有一個類Dog
和一個類Cat
。他們都延伸Animal
。現在Animal
可能會有一個名稱和一些方法,但沒有任何意義可以讓Animal
運行。一個Animal
是...以及一個抽象的概念。
在其他情況下,你可能有子類(在LinkedHashSet
例如擴展HashSet
),但它仍然使一個很大的意義來實例化超類(HashSet
在這種情況下)。
爲了回答您的評論,「是否有意義,使一類是非抽象的,即使你不想實例化。」
嗯,我會說,如果你,今天,根本不知道它應該被實例化的任何用例,同樣的規則適用:有一個類的實例是否有意義(邏輯上)?如果是這樣,請將其設置爲非抽象。
如果情況更像「如果你已經創建了這個類的實例,你可能做錯了!」然後我通過使這個類抽象來澄清這一點。
Yeap,謝謝。 Bur我仍然感興趣,是否有任何情況下我們使用非抽象類但不創建它的實例? – 2010-11-30 07:11:37
那麼,我能想到的最接近的想法是當你使用單例模式。然後,在創建單個實例後,您不想創建任何實例。在這種情況下,您通常會將構造函數設爲私有的,以避免創建更多實例。 – aioobe 2010-11-30 07:20:29
感謝您的回答。 – 2010-11-30 07:42:52
如果類是完整且可用的,即使用戶決定稍後擴展它,也應該能夠實例化並使用該類。
如果用戶需要實現某些邏輯以使其在其使用的框架中發揮作用,那麼該類應該只是抽象的,也就是說,類設計者不知道該類將如何使用的確切實現細節,比如模板或命令設計模式。
以下是@aioobe - 請考慮以下情況。
在一家公司,你有一個職位叫做01會計師。現在假設你有一個專門從事審計的人,我們說他的頭銜是審計員。現在,公司有100名會計師,但只有4名審計師。在這種情況下,你會想實例化兩個的會計師和審計類,即使會計師是一個超一流審計的。
- 1. 在這種情況下應該是什麼數據類型?
- 2. 在什麼情況下,表單方法應該是GET,它應該是什麼情況POST
- 3. 爲什麼'這'不是它在這種情況下應該是什麼?
- 4. 繼承從抽象類的情況下,不類代碼重複
- 5. 在什麼情況下你會更喜歡沒有方法的抽象類?
- 6. 這種情況下unique_ptr的行爲應該是什麼?
- 7. 數據應該描述自己嗎?在什麼情況下最好是不是?
- 8. 抽象類中字段的可訪問性應該是什麼?
- 9. 在什麼情況下應該使用AUTOINCREMENT而不是默認的ROW ID?
- 10. 什麼是objc_setAssociatedObject()以及在什麼情況下應該使用它?
- 11. 在不使用保護的情況下處理抽象類的正確方法是什麼?
- 12. 什麼是抽象類型?
- 13. 什麼情況下phys_base不是0?
- 14. 在這種情況下的接口和抽象類
- 15. 什麼是在PHP中的抽象類?
- 16. 什麼是CI_Controller built_in類?不管它是抽象的還是不抽象的?
- 17. 在以下情況下,接口還是抽象類或兩者都更好?
- 18. 我應該創建靜態方法還是抽象超類
- 19. 在什麼情況下,該應用程序:didFinishLaunchingWithOptions:被調用?
- 20. 在什麼情況下應該避免單元測試?
- 21. OpenLayers:在什麼情況下我應該銷燬地圖
- 22. 我應該在什麼情況下使用模塊和課程
- 23. 在什麼情況下REST API應該返回HTTP狀態503
- 24. 在什麼情況下我們應該選擇maven?
- 25. 什麼是在這種情況下
- 26. 什麼是在這種情況下
- 27. 在這種情況下應該是什麼樣的正確的JavaScript語法?
- 28. 在不需要的情況下應該保留還是放棄?
- 29. 在不使用接口的情況下從抽象超類中使用泛型類型獲取屬性?
- 30. 這是爲什麼抽象類在PHP
可能重複[爲什麼不是java.lang.Throwable抽象類?](http://stackoverflow.com/questions/4306214/why-isnt-java-lang-throwable-an-abstract-class) – EJP 2010-11-30 09:33:30