2011-01-12 121 views
3

爲什麼我們要聲明一個類是抽象的?我知道它不能實例化,但爲什麼給它一個特殊的關鍵字。即使是一個「普通」班級也可以很好地工作,並且可以很容易地進行分類。那麼做一個類抽象的主要優點是什麼?製作課堂摘要的主要優勢是什麼

+0

@Justin:這是嘲弄嗎?我想我只是想清除一個概念 – TimeToCodeTheRoad 2011-01-12 18:09:38

+0

抱歉!我真的明白你的觀點!只是試圖讓這個概念清除很長時間,所以寫了這個。相信我,你的文章確實有幫助! – TimeToCodeTheRoad 2011-01-12 18:14:21

回答

6

在抽象類中,你可以實現一些方法,並且可以抽象一些你的客戶端必須實現的方法。您可以提供一些常用的功能,也可以在這裏有一些繼承的字段和一些骨架方法

+0

即使我沒有提出課堂摘要,我仍然可以這樣做。所以,爲什麼要把它抽象 – TimeToCodeTheRoad 2011-01-12 18:04:06

+0

@TimeToCodeTheRoad你怎麼能把它做成抽象的? – 2011-01-12 18:05:22

2

聲明類抽象可以防止任何代碼實例化類。

這強制執行設計指南,使非葉類抽象。

它允許您稍後將抽象方法添加到您的超類(以及子類的實現),而不會影響任何現有的客戶端。

即使非葉類當前沒有任何抽象方法,抽象關鍵字仍起作用。

0

如果您想擁有一組繼承相同邏輯功能的類,這將非常有用。 但是在同一時間,類只實現了基本邏輯,並且不包含任何實際的功能。

你應該將它看作骨架類。

例如,有一次我做這些規範的類:在另一個線程上執行命令的

  1. 控制的過程中,中繼這一進程的事件。

  2. 類本身沒有本身的任何功能(沒有實現實際工作()函數)

所以結果是一個抽象類,可以繼承,已經有一個內置的線程控制,你只需要實現work()方法即可。

0

如果你的類有一些默認行爲,並且你希望擴展類實現一些其他行爲,那麼你使用抽象類。它們不能被初始化,你可以將抽象類看作是擴展類的模板。

抽象類還可以調用結果調用擴展對象方法的抽象方法。無論如何,有很多關於何時使用抽象類的討論,何時通過接口來選擇。做一個谷歌搜索,這是一個史詩般的討論:)接口與抽象類。

0

如果創建它的一個實例(您將創建子類的實例)幾乎毫無意義,您將聲明一個類爲抽象類。

public abstract class Shape { 
    public double calculateArea(); 
} 

public class Square : Shape { 
    private double side; 

    double calculateArea() { 
     return side*side; 
    } 
} 

public class Circle: Shape { 
    private double radius; 

    double calculateArea() { 
     return 3.1415 * radius * radius; 
    } 
} 

public class MainClass() { 
    public static void Main() { 
     Shape myShape = new Square(); 
     system.out.print(myShape.calculateArea()); 
     myShape = new Circle(); 
    } 
} 

這是沒有意義的創造Shape一個實例,因爲它並不意味着什麼具體的,它的一個抽象的概念。但是,您可以使用Shape類型的變量,它允許您圍繞常見的基本類型進行編程(儘管可能會認爲在這種情況下接口可能會更好)。

2

抽象類可以有抽象方法和「具體」方法。

「具體」方法可以使用抽象方法,並且可以確定它們在運行時被推送(正確)。因爲每個(不是抽象的)子類都必須實現它們。 (而且它不會是抽象類的實例)。

所以這都是關於保存! - 它確保想要繼承抽象類的程序員必須實現抽象方法。

如果你只用一個普通的類來做到這一點,那麼對應於抽象類的類將具有帶有空實現的(抽象)方法,並且只有程序員必須覆蓋這個方法。

當然,您可以使用抽象類的概念來進行其他思考,比如創建不可實例化的類,但這不是主要觀點。

3

我認爲你誤解了抽象類的要點:它們提供了一些功能的部分實現,但不是完整的實現。

您建議抽象類是多餘的,因爲您可以使用public void methodname(){}定義不完整的方法 - 這當然可以。但是,假設您的客戶端繼承自以這種方式定義的類,那麼他們如何知道要覆蓋哪些方法?如果他們忘記重寫某個方法會發生什麼?現在他們的派生類有一個不完整的定義 - 你不需要這個。

抽象關鍵字強制客戶端爲某些方法提供實現,否則代碼甚至不會編譯。換句話說,它提供了編譯時保證,您使用或創建的類已完全實現。

2

只是一個現實生活中的例子。我有一個GUI抽象類,它是我所有GUI組件的父類。讓我們稱這個AbstractSuperClass。每個擴展AbstractSuperClass的組件都需要自己實現保存功能。所以關於創建我的超類抽象的好處是我可以擁有一個可以容納我所有GUI組件的AbstractSuperClass類型數組。然後,我可以遍歷該數組並調用save函數,以瞭解每個GUI組件都有其自己的保存方法。由於類是抽象的,它迫使我的子類提供save函數的實現。

這是特別有用的,因爲當我們打開我們的API給其他程序員時,他們沒有得到源代碼。它們只是擴展AbstractSuperClass並且必須提供一個保存實現。

0

一般來說,如果在超類域類中存在繼承,在子類中使用通用方法和通用實現,那麼請考慮抽象類,這並不常見,但我確實使用它。

如果僅僅因爲存在繼承而使用抽象類,那麼如果代碼改變很多,就會遇到問題。這個例子在這裏詳細描述:Interfaces vs Abstract Classes in Java,針對電機的不同類型的域對象。其中一個需要一個雙動力馬達,而不是一個特定的單一類型,如太陽能供電或電池供電的馬達。這需要來自兩種運動類型的多個子類實現方法用於單個子類,這就是抽象類可能會變得混亂的地方。總而言之,作爲一項規則,您希望使用接口定義行爲(對象將執行的操作)而不是抽象類。在我看來,抽象類的主要優勢在於何時來自用例的焦點在於實現層次結構和來自子類的代碼重用。

相關問題