根據http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.html抽象與抽象類
抽象有兩種口味。一個是函數抽象,另一個是數據抽象。但抽象類適合在哪裏?就我所知,抽象類是一個完全不同的概念,即使名稱暗示它與OOP原則有關。
有人可以請說明這一點嗎?
根據http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.html抽象與抽象類
抽象有兩種口味。一個是函數抽象,另一個是數據抽象。但抽象類適合在哪裏?就我所知,抽象類是一個完全不同的概念,即使名稱暗示它與OOP原則有關。
有人可以請說明這一點嗎?
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);
一般而言,對象將數據與功能結合在一起,抽象類也不例外。在某些情況下,提供的抽象幾乎是純粹的數據,僅提供訪問數據的功能(例如集合類)。其他情況幾乎相反(例如,C++中的函子提供的抽象通常幾乎是一個函數)。
那些當然是非常極端 - 很多(大多數?)類落在他們之間。
是的,這是我的論點。但是你沒有提到抽象類和抽象概念是否相同或不同? – crowso
@ user581544:我的觀點是抽象類*可以*代表不同程度的一種或兩種。 –
這些是非常不同的概念。
抽象類似於黑匣子的概念。輸入進去,黑匣子做一些事情,輸出出來。黑箱中發生的事情並不重要,所有你必須知道的是它的工作原理。一個真實的例子就是java的散列函數,所有用戶必須知道的是它散列了輸入值,對用戶來說散列的數量並不重要。黑盒是抽象的。關鍵是你不必知道它是如何工作的,只是它的確如此。
抽象類(至少在Java中)是接口和完整的OOP類之間的混合。一個接口定義了任何擴展類必須具有的方法,它在代碼中的一個協議,它將正確地實現接口,並確保所有事情都按預期工作。抽象類具有這些空方法(協議),並且已經完全實現了可以調用的方法。
http://www.javacoffeebreak.com/faq/faq0084.html。 –
@ crowso-你不滿意答案嗎?請接受其中一個答案 –