2012-09-26 9 views
6

zgodnie z http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.htmlabstrakcja kontra abstrakcyjna klasa

abstrakcja występuje w dwóch smakach. Jedna to abstrakcja funkcji, a druga to abstrakcja danych. Ale gdzie mieszczą się zajęcia abstrakcyjne? O ile widzę, klasy abstrakcyjne są zupełnie inną koncepcją i chociaż nazwa sugeruje, że ma ona coś wspólnego z zasadami OOP.

Czy ktoś mógłby rzucić trochę światła na to?

+0

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

+0

@ crowso- nie jesteś jeszcze zadowolony z odpowiedzi? Proszę przyjąć jedną z odpowiedzi –

Odpowiedz

2

Wiki stawia go bardzo dokładnie

danych abstrakcji

abstrakcję danych wymusza wyraźne rozgraniczenie między abstrakcyjnych właściwości typu danych i konkretnych informacji o jego realizacji. Właściwości abstrakcyjne to te, które są widoczne dla kodu klienta, który wykorzystuje typ danych - interfejs dla typu danych - podczas gdy konkretna implementacja jest utrzymywana całkowicie prywatnie i rzeczywiście może się zmieniać, na przykład w celu uwzględnienia poprawy wydajności w czasie. Chodzi o to, że takie zmiany nie powinny mieć żadnego wpływu na kod klienta, ponieważ nie pociągają za sobą żadnej różnicy w abstrakcyjnym zachowaniu. Na przykład można zdefiniować abstrakcyjny typ danych o nazwie tabela odnośników, która jednoznacznie kojarzy klucze z wartościami i w których wartości można pobrać, podając odpowiednie klucze. Taka tablica przeglądowa może być implementowana na różne sposoby: jako tablica asocjacyjna, drzewo wyszukiwania binarnego, a nawet prosta lista liniowa par (klucz: wartość). Jeśli chodzi o kod klienta, abstrakcyjne właściwości tego typu są w każdym przypadku takie same.

Rozważmy na przykład przykładowy fragment Javy, aby przedstawić niektóre zwykłe "zwierzęta" z gospodarstwa na poziom abstrakcji odpowiedni do modelowania prostych aspektów ich głodu i karmienia. Definiuje klasę Animal reprezentować zarówno stan zwierzęcia i jego funkcje:

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; 
    } 
} 

z powyższą definicją, można tworzyć obiekty typu Animal i nazywają swoje metody tak:

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

Obiekty ogólnie łączą dane z funkcjonalnością, a klasa abstrakcyjna nie jest wyjątkiem. W niektórych przypadkach dostarczona abstrakcja jest prawie czystym danymi, a funkcje służą jedynie zapewnieniu dostępu do danych (np. Klas kolekcji). Inne przypadki są prawie odwrotne (np. Abstrakcja zapewniona przez funktora w C++ jest zazwyczaj w dużej mierze funkcją).

Są to oczywiście skrajności - wiele (najbardziej?) Klas mieści się gdzieś pomiędzy nimi.

+0

tak, to jest moja argumentacja. Ale nie wspomniałeś o klasie abstrakcyjnej i abstrakcyjnej koncepcji, czy te dwie są takie same czy różne? – crowso

+0

@ user581544: Chodzi mi o to, że klasa abstrakcyjna * może * reprezentować jedną lub obie w różnym stopniu. –

5

To są bardzo różne koncepcje.

Abstrakcja jest podobna do koncepcji czarnej skrzynki. Wejście wchodzi, czarna skrzynka coś robi, wyjście wychodzi. Nie ma znaczenia, co dzieje się w czarnej skrzynce, wszystko, co musisz wiedzieć, to to, że działa. Prawdziwym przykładem tego jest funkcja haszująca javy, wszystko, co musi wiedzieć użytkownik, to to, że haszuje wartość wejściową, nie ma znaczenia dla użytkownika, w jaki sposób numer jest mieszany. Czarna skrzynka to abstrakcja. Chodzi o to, że nie musisz wiedzieć, jak to działa, tylko że tak.

Klasy abstrakcyjne (przynajmniej w języku Java) to połączenie interfejsów i pełnych klas OOP. Interfejs definiuje metody, które musi posiadać każda rozszerzająca się klasa, jest zgodna w kodzie, że poprawnie implementuje interfejs i zapewnia, że ​​wszystko będzie działać zgodnie z oczekiwaniami.Klasa abstrakcyjna ma te puste metody (umowy), a także w pełni wdrożyła metody, które można wywoływać.

Powiązane problemy