2010-11-30 82 views
7

this線程我發現了一些有趣的時刻,如果類只用作超類,那麼就沒有規則使它變得抽象。爲什麼這樣?在什麼情況下,超類不應該是抽象的?

感謝

+0

可能重複[爲什麼不是java.lang.Throwable抽象類?](http://stackoverflow.com/questions/4306214/why-isnt-java-lang-throwable-an-abstract-class) – EJP 2010-11-30 09:33:30

回答

9

這一切都取決於它是否很有意義的類的實例。

假設您例如有一個類Dog和一個類Cat。他們都延伸Animal。現在Animal可能會有一個名稱和一些方法,但沒有任何意義可以讓Animal運行。一個Animal是...以及一個抽象的概念。

在其他情況下,你可能有子類(在LinkedHashSet例如擴展HashSet),但它仍然使一個很大的意義來實例化超類(HashSet在這種情況下)。


爲了回答您的評論,「是否有意義,使一類是非抽象的,即使你不想實例化。

嗯,我會說,如果你,今天,根本不知道它應該被實例化的任何用例,同樣的規則適用:有一個類的實例是否有意義(邏輯上)?如果是這樣,請將其設置爲非抽象。

如果情況更像「如果你已經創建了這個類的實例,你可能做錯了!」然後我通過使這個類抽象來澄清這一點。

+0

Yeap,謝謝。 Bur我仍然感興趣,是否有任何情況下我們使用非抽象類但不創建它的實例? – 2010-11-30 07:11:37

+1

那麼,我能想到的最接近的想法是當你使用單例模式。然後,在創建單個實例後,您不想創建任何實例。在這種情況下,您通常會將構造函數設爲私有的,以避免創建更多實例。 – aioobe 2010-11-30 07:20:29

+0

感謝您的回答。 – 2010-11-30 07:42:52

1

如果類是完整且可用的,即使用戶決定稍後擴展它,也應該能夠實例化並使用該類。

如果用戶需要實現某些邏輯以使其在其使用的框架中發揮作用,那麼該類應該只是抽象的,也就是說,類設計者不知道該類將如何使用的確切實現細節,比如模板或命令設計模式。

4

以下是@aioobe - 請考慮以下情況。

在一家公司,你有一個職位叫做01​​會計師。現在假設你有一個專門從事審計的人,我們說他的頭銜是審計員。現在,公司有100名會計師,但只有4名審計師。在這種情況下,你會想實例化兩個會計師審計類,即使會計師是一個超一流審計的。

相關問題