451 Stimmen

Unterschied zwischen Abstraktion und Verkapselung?

Was ist der genaue Unterschied zwischen Kapselung und Abstraktion?

316voto

Konrad Rudolph Punkte 503837

Die meisten Antworten hier konzentrieren sich auf OOP, aber die Kapselung beginnt viel früher:

  • Jede Funktion ist eine Verkapselung ; in Pseudocode:

    point x = { 1, 4 }
    point y = { 23, 42 }
    
    numeric d = distance(x, y)

    Hier, distance kapselt die Berechnung des (euklidischen) Abstands zwischen zwei Punkten in einer Ebene: Sie verbirgt Implementierungsdetails. Das ist Kapselung pur und einfach.

  • Abstraktion ist der Prozess der Verallgemeinerung : Man nimmt eine konkrete Implementierung und macht sie für verschiedene, wenn auch irgendwie verwandte Datentypen anwendbar. Das klassische Beispiel für Abstraktion ist C's qsort Funktion zum Sortieren von Daten:

    Die Sache mit qsort ist, dass es sich nicht um die Daten kümmert, die es sortiert - im Gegenteil, es weiß es nicht welche Daten es sortiert. Vielmehr ist sein Eingabetyp ein typloser Zeiger ( void* ), was nur die Art von C ist, zu sagen: "Der Typ der Daten ist mir egal" (dies wird auch als Typ-Löschung bezeichnet). Der wichtige Punkt ist, dass die Implementierung von qsort bleibt immer gleich, unabhängig vom Datentyp. Die einzige Sache, die hat zu ändern, ist die Vergleichsfunktion, die sich von Datentyp zu Datentyp unterscheidet. qsort erwartet daher, dass der Benutzer die Vergleichsfunktion als Funktionsargument angibt.

Kapselung und Abstraktion gehen Hand in Hand, so dass man sagen könnte, dass sie wirklich untrennbar sind. Für praktische Zwecke ist dies wahrscheinlich wahr; dennoch ist hier eine Kapselung, die nicht viel von einer Abstraktion hat:

class point {
    numeric x
    numeric y
}

Wir kapseln die Koordinaten des Punktes ein, aber wir abstrahieren sie nicht materiell, sondern gruppieren sie nur logisch.

Und hier ist ein Beispiel für Abstraktion, die keine Kapselung ist:

T pi<T> = 3.1415926535

Dies ist eine generische Variable pi mit einem bestimmten Wert (), und die Deklaration kümmert sich nicht um den genauen Typ der Variablen. Zugegeben, es wäre schwierig, so etwas in echtem Code zu finden: Abstraktion verwendet praktisch immer Kapselung. Allerdings ist die obige fait gibt es in C++(14) tatsächlich, und zwar über variable Vorlagen (= generische Vorlagen für Variablen); mit einer etwas komplexeren Syntax, z.B.:

template <typename T> constexpr T pi = T{3.1415926535};

228voto

haccks Punkte 100455

Viele Antworten und ihre Beispiele sind irreführend.

Verkapselung ist die Verpackung von "Daten" y "Funktionen, die mit diesen Daten arbeiten" zu einer einzigen Komponente zusammenfassen und den Zugang zu einigen Komponenten des Objekts einschränken.
Kapselung bedeutet, dass die interne Repräsentation eines Objekts im Allgemeinen außerhalb der Definition des Objekts verborgen ist.

Abstraktion ist ein Mechanismus, der die wesentlichen Merkmale darstellt, ohne Implementierungsdetails zu enthalten.

Verkapselung: -- Verbergen von Informationen .
Abstraktion: -- Implementierung Verstecken .

Beispiel (in C++):

class foo{
    private:
        int a, b;
    public:
        foo(int x=0, int y=0): a(x), b(y) {}

        int add(){    
            return a+b;   
        } 
}  

Interne Darstellung eines beliebigen Objekts von foo Klasse außerhalb der Klasse verborgen ist. --> Verkapselung.
Jedes zugängliche Mitglied (Daten/Funktion) eines Objekts von foo ist eingeschränkt und kann nur von diesem Objekt aufgerufen werden.

foo foo_obj(3, 4);
int sum = foo_obj.add();

Durchführung der Methode add verborgen ist. --> Abstraktion.

149voto

dirkgently Punkte 104289

Verkapselung verbirgt die Implementierungsdetails, die für generisches oder spezialisiertes Verhalten sein können oder auch nicht.

Abstraktion ist eine Verallgemeinerung (z. B. über eine Reihe von Verhaltensweisen).

Hier ist eine gute Lektüre: Abstraktion, Verkapselung und Verbergen von Informationen von Edward V. Berard von der Object Agency.

116voto

Steven A. Lowe Punkte 59247

Durch die Verkapselung werden einige Dinge in eine Kiste gesteckt und man bekommt ein Guckloch; das hält einen davon ab, an den Zahnrädern herumzufummeln.

Die Abstraktion ignoriert die Details, die keine Rolle spielen, z. B. ob die Dinge Zahnräder, Ratschen, Schwungräder oder Atomkerne haben; sie "gehen" einfach.

Beispiele für Verkapselung:

  • Unterhosen
  • Werkzeugkasten
  • Brieftasche
  • Handtasche
  • Kapsel
  • gefrorenes Karbonit
  • eine Box, mit oder ohne Knopf darauf
  • ein Burrito (eigentlich die Tortilla um den Burrito)

Beispiele für Abstraktion:

  • "Gruppen von Dingen" ist eine Abstraktion (die wir Aggregation nennen)
  • "Dinge, die andere Dinge enthalten" ist eine Abstraktion (die wir Komposition nennen)
  • "Container" ist eine weitere Art von "Dinge, die andere Dinge enthalten"-Abstraktion; beachten Sie, dass alle Verkapselungsbeispiele Arten von Containern sind, aber nicht alle Container eine Verkapselung aufweisen/ermöglichen. Ein Korb zum Beispiel ist ein Behälter, der seinen Inhalt nicht einkapselt.

77voto

NoNaMe Punkte 5656

Verkapselung bedeutet: Ausblenden von Daten, z. B. mit Getter und Setter usw.

Abstraktion bedeutet - Verbergen der Implementierung durch abstrakte Klassen und Schnittstellen usw.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X