2012-09-26 162 views
6

根據http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.html抽象與抽象類

抽象有兩種口味。一個是函數抽象,另一個是數據抽象。但抽象類適合在哪裏?就我所知,抽象類是一個完全不同的概念,即使名稱暗示它與OOP原則有關。

有人可以請說明這一點嗎?

+0

http://www.javacoffeebreak.com/faq/faq0084.html。 –

+0

@ crowso-你不滿意答案嗎?請接受其中一個答案 –

回答

2

Wiki把它非常精確地

數據抽象

數據抽象強制數據類型的抽象性及其實施的具體細節明確分開。抽象屬性是那些對於使用數據類型(數據類型的接口)的客戶端代碼可見的,而具體實現完全保持私有,並且確實可以改變,例如隨着時間的推移將效率提高。這個想法是這樣的改變不應該對客戶端代碼有任何影響,因爲它們在抽象行爲中沒有任何區別。例如,可以定義稱爲查找表的抽象數據類型,其將鍵與值唯一地關聯,並且可以通過指定其對應的鍵來檢索其中的值。這樣的查找表可以以各種方式實現:作爲散列表,二叉查找樹,或者甚至是(鍵:值)對的簡單線性列表。就客戶端代碼而言,類型的抽象屬性在每種情況下都是相同的。

例如,考慮一個示例Java片段來將某些常見農場「動物」表示爲適合對其飢餓和飼養的簡單方面建模的抽象級別。它定義了一個動物類來表示動物兩者的狀態和其功能:

public class Animal extends LivingThing 
{ 
    private Location loc; 
    private double energyReserves; 

    public boolean isHungry() { 
     return energyReserves < 2.5; 
    } 
    public void eat(Food f) { 
     // Consume food 
     energyReserves += f.getCalories(); 
    } 
    public void moveTo(Location l) { 
     // Move to new location 
     loc = l; 
    } 
} 

採用上述定義,我們可以創建Animal類型的對象和調用它們的方法是這樣的:

thePig = new Animal(); 
theCow = new Animal(); 
if (thePig.isHungry()) { 
    thePig.eat(tableScraps); 
} 
if (theCow.isHungry()) { 
    theCow.eat(grass); 
} 
theCow.moveTo(theBarn); 
0

一般而言,對象將數據與功能結合在一起,抽象類也不例外。在某些情況下,提供的抽象幾乎是純粹的數據,僅提供訪問數據的功能(例如集合類)。其他情況幾乎相反(例如,C++中的函子提供的抽象通常幾乎是一個函數)。

那些當然是非常極端 - 很多(大多數?)類落在他們之間。

+0

是的,這是我的論點。但是你沒有提到抽象類和抽象概念是否相同或不同? – crowso

+0

@ user581544:我的觀點是抽象類*可以*代表不同程度的一種或兩種。 –

5

這些是非常不同的概念。

抽象類似於黑匣子的概念。輸入進去,黑匣子做一些事情,輸出出來。黑箱中發生的事情並不重要,所有你必須知道的是它的工作原理。一個真實的例子就是java的散列函數,所有用戶必須知道的是它散列了輸入值,對用戶來說散列的數量並不重要。黑盒是抽象的。關鍵是你不必知道它是如何工作的,只是它的確如此。

抽象類(至少在Java中)是接口和完整的OOP類之間的混合。一個接口定義了任何擴展類必須具有的方法,它在代碼中的一個協議,它將正確地實現接口,並確保所有事情都按預期工作。抽象類具有這些空方法(協議),並且已經完全實現了可以調用的方法。