簡體   English   中英

從抽象類和非抽象類派生的差異

[英]Difference in deriving from abstract and non abstract class

在OOP中,我看到很多類派生自父類,但父類沒有標記為抽象類。 當類IS被標記為抽象時,它提供了什么優勢?

謝謝

差異非常實用:抽象基類是從不打算實例化的基類,因此不必提供完整的實現。 這意味着ABC可以在不實現類的情況下為派生類定義合約

這有兩種方便:

  • 您可以定義沒有完整實現但是對整個類進行斷言的抽象對象。 這方面的一個例子是讓DrawItem類具有draw()方法,該方法是Circle,Rectangle等的基類。 DrawItem 知道如何繪制自己,因為它不知道它什么。

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

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

Paul Haahr 提出了有趣的建議 ,例如:

不要具體類的子類

(閱讀原文,我不想復制和粘貼一切;-)。

Paul寫了關於Java的文章,但我發現至少他的這部分建議適用於大多數OO設計任務(雖然實際上我仍然偶爾會在編碼時偏離它,它在我的設計中很活躍;-),即使我在我將用C ++,Python或其他方式實現它。 如果在閱讀保羅的推理后,你發現自己同意他的意思,那么你將來會使用更多抽象的類(允許子類化;-)。

調用類“抽象”本質上是為了向你的程序員傳達它不完整的東西:他們需要編寫更多的代碼才能使用它。

實際上,在函數式編程中部分應用了函數並行...

抽象類不能自己實例化; 它必須來源於實例化。 本質上,類的抽象定義表明它不是要實例化為自身,獲取它的實例的唯一方法是從該類繼承,並實例化繼承的類。

編譯器不允許你實例化它的事實?

舉一個我認為相關的例子:

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

    public abstract void PleaseOverideMe(CustomSocketConnection c)
    {

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM