2009-06-07 118 views

回答

0

一個抽象類不能被自己實例化;它必須來源於被實例化。本質上,類的抽象定義表明它並不打算作爲自身實例化,獲得它的實例的唯一方法是從該類繼承,並實例化繼承的類。

0

事實上,編譯器不會允許你實例化它嗎?

2

這個區別實際上非常實用:抽象基類是永遠不會被實例化的基類,因此不一定提供完整的實現。這意味着ABC可以定義一個合同的派生類,而不是實施該類。

這兩種方式方便:

  • 你可以定義沒有全面實施,但做出全班斷言抽象對象。其中一個例子是使用CircleItem,Rectangle等基類的draw()方法創建一個DrawItem類。 DrawItem 不能知道如何繪製自己,因爲它不知道它是什麼

  • 您可以定義可以有兩個具體實現的類。這顯示在代理模式中,也可以用來構建模擬對象以進行測試。

這是比較常見的這些天,新的語言來定義接口模塊混入這些東西;事實證明,對於那些更直觀的概念,使用ABC幾乎總是屬於用例。

1

保羅Haahr具有interesting suggestions,如:

不要繼承具體的類

(閱讀原著,我不想複製和粘貼一切;-) 。

保羅的關於Java寫的,但我覺得至少他的建議,這部分是適用於幾乎所有的面向對象設計的任務(雖然務實我還是會偶爾偏離它在編碼,它的生命力,在我設計 ;-),甚至當我要用C++,Python或其他方式實現它時。如果在閱讀保羅的推理之後,你發現自己同意他的觀點,你將來會使用更多的抽象類(以允許子類;-)。

+0

好的鏈接!感謝那。 – dotnetdev 2009-06-07 01:04:36

0

給什麼,我想到一個例子是中肯:

public abstract class CustomSocket() 
{ 
    CustomSocket() 
    { 
    } 

    public abstract void PleaseOverideMe(CustomSocketConnection c) 
    { 

    } 

} 
1

要調用一個類「抽象」本質上是對你的同胞程序員溝通,它是不完整的:他們希望多寫一點代碼能夠使用它。

這裏實際上有與功能編程中的函數的部分應用並行的...

+0

這就像是說 - iv'e來這麼遠 - 這是你知道 – divinci 2009-06-07 02:15:37