Was ist der genaue Unterschied zwischen Kapselung und Abstraktion?
Antworten
Zu viele Anzeigen?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 vonqsort
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};
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.
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.
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.
Verkapselung bedeutet: Ausblenden von Daten, z. B. mit Getter und Setter usw.
Abstraktion bedeutet - Verbergen der Implementierung durch abstrakte Klassen und Schnittstellen usw.
- See previous answers
- Weitere Antworten anzeigen