回答
一個抽象類不能被自己實例化;它必須來源於被實例化。本質上,類的抽象定義表明它並不打算作爲自身實例化,獲得它的實例的唯一方法是從該類繼承,並實例化繼承的類。
事實上,編譯器不會允許你實例化它嗎?
這個區別實際上非常實用:抽象基類是永遠不會被實例化的基類,因此不一定提供完整的實現。這意味着ABC可以定義一個合同的派生類,而不是實施該類。
這兩種方式方便:
你可以定義沒有全面實施,但做出全班斷言抽象對象。其中一個例子是使用CircleItem,Rectangle等基類的
draw()
方法創建一個DrawItem類。 DrawItem 不能知道如何繪製自己,因爲它不知道它是什麼是。您可以定義可以有兩個具體實現的類。這顯示在代理模式中,也可以用來構建模擬對象以進行測試。
這是比較常見的這些天,新的語言來定義接口或模塊或混入這些東西;事實證明,對於那些更直觀的概念,使用ABC幾乎總是屬於用例。
保羅Haahr具有interesting suggestions,如:
不要繼承具體的類
(閱讀原著,我不想複製和粘貼一切;-) 。
保羅的關於Java寫的,但我覺得至少他的建議,這部分是適用於幾乎所有的面向對象設計的任務(雖然務實我還是會偶爾偏離它在編碼,它的生命力,在我設計 ;-),甚至當我要用C++,Python或其他方式實現它時。如果在閱讀保羅的推理之後,你發現自己同意他的觀點,你將來會使用更多的抽象類(以允許子類;-)。
給什麼,我想到一個例子是中肯:
public abstract class CustomSocket()
{
CustomSocket()
{
}
public abstract void PleaseOverideMe(CustomSocketConnection c)
{
}
}
要調用一個類「抽象」本質上是對你的同胞程序員溝通,它是不完整的:他們希望多寫一點代碼能夠使用它。
這裏實際上有與功能編程中的函數的部分應用並行的...
這就像是說 - iv'e來這麼遠 - 這是你知道 – divinci 2009-06-07 02:15:37
- 1. 從非抽象類派生抽象類
- 2. 使用抽象類來實現派生
- 3. C++派生類是抽象錯誤
- 4. 從抽象類
- 5. 派生自抽象類,僅引用派生類
- 6. 抽象基類的抽象子類
- 7. 我們能否從抽象類的派生類中調用super.someMethod()?
- 8. 蟒蛇錯誤時從派生的類和抽象一個
- 9. 抽象類和非空值類型
- 10. 更多實現或非抽象類的抽象類?
- 11. C#從多個抽象類派生一個類
- 12. 從抽象類調用非抽象方法
- 13. 在抽象類中調用非抽象類方法
- 14. VC++從抽象類
- 15. 作爲抽象類的基類派生類
- 16. JAXB和抽象類
- 17. TreeSets和抽象類?
- 18. 抽象類中定義的非抽象事件不會在Designer中顯示派生類
- 19. 抽象類和匿名類
- 20. 抽象類和匿名類
- 21. 返回類和抽象類?
- 22. 抽象類的所有派生類型的KnownType?
- 23. 將值插入抽象類中的非抽象方法使用子非抽象類
- 24. 如何在從QObject派生的python中創建抽象基類
- 25. 帶有抽象類型組件的Fortran派生類型
- 26. Visual Studio:設計一個派生自抽象基類的UserControl類
- 27. 將每個派生類強制爲Singleton的抽象基類
- 28. 實現派生類接口方法的抽象基類
- 29. 爲什麼我的派生類是一個抽象類? C++
- 30. 非抽象類不能覆蓋Comparable中的抽象方法compareTo?
好的鏈接!感謝那。 – dotnetdev 2009-06-07 01:04:36