2010-07-29 10 views
6

Mögliche Duplizieren:
Abstraction VS Information Hiding VS EncapsulationUnterschied zwischen Verkapselung und Abstraktion Konzepten

Kann jemand mir die wichtigsten Unterschiede zwischen den Prinzipien der Verkapselung und Abstraktion in objektorientierter Programmierung (wenn möglich erklärt mit Beispielen).

+0

Diese Frage hat ziemlich gute Antworten. –

+0

Verkapselung bedeutet - Daten verbergen zB mit Getter und Setter etc. Abstraktion bedeutet - Verstecken der Implementierung mit abstrakten Klasse und Schnittstellen usw. – NoNaMe

+0

mögliche Duplikat von [genauer Unterschied zwischen Verkapselung und Abstraktion] (http://stackoverflow.com/questions/742341/difference-between-abstraktion-und-einkapselung/13589763 # 13589763) – NoNaMe

Antwort

6

Probe:

// NO ABSTRACTION, NO ENCAPSULATION 
const int catLegs = 4; 
const int spiderLegs = 8; 

Leg[] catLegs; 
Leg[] spiderLegs; 

void MakeCatRun(Distance b) { for (int i=0; i<catLegs; ++i) catLegs[i] += b; } 
void MakeSpiderRun(Distance b) { for (int i=0; i<spiderLegs; ++i) spiderLegs[i] += b; } 

Encapsulation:

// ENCAPSULATION 
class Cat 
{ 
    Leg[] legs; 
    int nLegs; 

    public void Run(Distance b) { for (int i=0; i < nLegs; ++i) leg[i] += b; } 
} 

class Spider 
{ 
    Leg[] legs; 
    int nLegs; 

    public void Run(Distance b) { for (int i=0; i < nLegs; ++i) leg[i] += b; } 
} 

Abstraktion:

// ABSTRACTION 
    class LivingBeing 
    { 
     Leg[] legs; 
     int nLegs; 

     public void Run(Distance b) { for (int i=0; i < nLegs; ++i) leg[i] += b; } 
    } 

    class Cat: LivingBeing  {  } 

    class Spider: LivingBeing { } 
+0

Aus Ihrem Beispiel scheint es, dass Abstraktion nichts anderes ist als - "Gemeinsame Eigenschaften in eine andere Klasse verschieben" –

4

Encapsulation bedeutet, dass das Objekt den internen Zustand (Daten) kann durch seine öffentlichen Methoden (öffentliche Schnittstelle) nur geändert werden:

bedeutet
class Encapsulated { 
    private int data; 

    public int getData() { return data; } 
    public void setData(int d) { data = d; } 
} 

Abstraktion, dass man abstrahieren konkrete Implementierungen, zum Beispiel:

abstract class Container { 
    int getSize(); 
} 

class LinkedList extends Container { 
    int getSize() { /* return the size */ } 
} 

class Vector extends Container { 
    int getSize() { /* ... */ } 
} 

Wenn Sie die abstrakte Containerklasse in Ihrem gesamten Code anstelle von Vector oder LinkedList verwenden, können Sie die konkrete Implementierung von Container (Vector/LinkedList in diesem Fall) ändern, ohne Ihren Code zu ändern, also abs Handeln Sie sich von der Implementierung ab.

1

Die beiden Konzepte sind unterschiedlich, aber eng verwandt und werden oft zusammen gefunden.

Abstraktion ist das Verbergen von nicht wesentlichen Details, die normalerweise als Implementierungsdetails bezeichnet werden. Um beispielsweise Daten aus einem Stream zu lesen, haben die meisten Umgebungen das Konzept einer InputStream. Es bietet eine ReadBytes() -Methode, um weitere Bytes aus dem Stream abzurufen. Wie es ist, wird dies abstrahiert - es könnte aus einer Datei lesen, die OS-Datei-APIs verwenden oder aus einem Socket lesen, aus SSH oder irgendetwas anderem, das als ein Strom von Bytes präsentiert werden kann. Die InputStream-Klasse wird als Abstraktion bezeichnet.

Jede Implementierung von InputStream-Codes, wie die Bytes gelesen werden. Ein FileInputStream liest beispielsweise Byte aus einer Datei und behält den aktuellen Offset als privates Datenelement in der Datei bei. Code außerhalb der Klasse hat keinen freien Zugriff, um diese Variable direkt zu lesen oder zu schreiben - dies könnte zu falschen Ergebnissen führen, beispielsweise wenn ein Teil des Streams übersprungen oder erneut gelesen wird. Dies ist besonders in Multithread-Szenarien wichtig, wenn Änderungen an der Variablen sorgfältig kontrolliert werden müssen. Anstatt einen uneingeschränkten Zugriff zu gewähren, verwendet die Klasse intern offset (durch Deklaration private) und gibt externen Code nur indirekten Zugriff, z. B. über eine Methode GetCurrentOffset() und Methoden Seek(int offset). Die Offset-Variable wird dann von der FileInputStream-Klasse gekapselt.

5

Abstraktion ist, dass die Qualität, die wir einfach nicht über unnötige interne Mechanismen (Implementierungen) stören und kann mit einem System/Objekt umgehen ct, Blick in die Wesentlichkeit.

Bsp: Beim Bremsen eines Autos ist es nicht wichtig, ob es eine Druckluftbremse oder eine Hydraulikbremse hat. Abstraktion kommt hier in Form eines Pedal-Push.

Encapsulation ist etwas, das durch die Verpackung (Verkapselung) Details der Implementierung innerhalb eines Behälters (versteckt weg brechen Mechanismen und winzige Komponenten von Ihrem Augenlicht oder physischem Kontakt, im obigen Fall), um den oben (Abstraktion) möglich macht,.

Also, Verkapselung in der Tat bietet Abstraktion!

Wenn Sie sich umsehen, können Sie es überall in der realen Welt sehen. Auch wenn es in der Programmierung ist - Wenn jemand Ihnen eine Klasse zur Sortierung Liste von ganzen Zahlen zur Verfügung stellt, müssen Sie sich nicht wirklich um den Sortieralgorithmus (Bubble Sort/Quick Sort) kümmern, die Abstraktion macht es möglich, dass Sie "übergeben die Liste der ganzen Zahlen zur Methode; das ist es.

Sehen Sie sich die folgende Animation an, um zu verstehen, wie eine saubere Abstraktion durch das Einkapseln interner Details im Inneren erreicht wird!

Bild mit freundlicher Genehmigung: this blog

enter image description here

+0

Im Kommentar im Code haben Sie gesagt: Nur diese Methode ist draußen zu sehen. Wie wird diese Methode an die Außenwelt weitergegeben? Ist es durch den Quellcode oder eine Dokumentation der APIs? –

+0

@LinuxPenseur es ist als öffentlich markiert und daher außerhalb der Klasse sichtbar – WinW