簡體   English   中英

何時使用抽象類?

[英]When to use abstract classes?

這是關於抽象類的 MSDN 文章,但我真的不明白......

我什么時候應該真正使用抽象類? 使用抽象類有什么好處?

當您需要一個類來實現繼承和多態時,抽象類很有用,但實例化類本身,只有它的子類是沒有意義的。 當您想要為一組共享一些常見實現代碼的子類定義模板時,通常會使用它們,但您也希望保證不能創建超類的對象。

例如,假設您需要創建Dog,Cat,Hamster和Fish對象。 它們具有類似的屬性,如顏色,大小和腿數以及行為,因此您可以創建一個Animal超類。 但是,什么顏色的動物? Animal對象有多少條腿? 在這種情況下,實例化Animal類型的對象而不僅僅是它的子類沒有多大意義。

抽象類在多態中也有額外的好處 - 允許您使用(抽象)超類的類型作為方法參數或返回類型。 例如,如果你有一個帶有train()方法的PetOwner類,你可以將它定義為接受Animal類型的對象,例如train(Animal a),而不是為Animal的每個子類型創建一個方法。

通過使用抽象類,我們可以使類更通用。

例如:如果類A是一個抽象類,並且有類B類,類C和類D擴展抽象類A,那么這些子類將繼承一個已經在抽象類A中聲明的方法,從而使該方法更通用。

您將它們用於永遠不會創建的類(因此實際上不存在),但是出於多態原因,您希望從它們繼承它們。

在為類heirarchy中的類定義行為時,請使用抽象類,該類永遠不會用於直接實例化對象。

所以,暫時把自己想象成上帝吧。 您的CBabyBoy和CBanyGirl類不是抽象的 - 因為這些是可以創建的實體對象。 另一方面,你的CPerson和CAnimal類應該是抽象的 - 從類型層次結構的角度看它們是有用的,但是你永遠不會運行CAnimal dingbat = new Animal();

理查德提供了一個例子 ,一個抽象類比非抽象類有優勢。

我想添加一個事實表,用於在抽象類和接口之間進行選擇。 圖像可以在這里找到。

在此輸入圖像描述

基本上,你應該使用一個抽象類,當你的層次結構中的某個實體邏輯上將擁有它不知道如何實現的方法時,但它的后代卻是如此。 網上有數十億“現實生活”的例子,真的)

暫無
暫無

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

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