Ich hatte heute ein Interview. Ich hatte eine Frage von OOP zum Unterschied zwischen Verkapselung und Abstraktion .
Ich antwortete ihr zu meinem Wissen, dass Encapsulation im Wesentlichen darin besteht, Datenelemente und Elementfunktionen in einer einzigen Einheit namens Klasse zu binden . Während Abstraction im Wesentlichen dazu dient, die Komplexität der Implementierung zu verbergen und den Benutzern einen einfachen Zugriff zu ermöglichen. Ich dachte, sie würde mit meiner Antwort gut zurechtkommen. Aber sie fragte, ob der Zweck von beiden darin besteht, Informationen zu verbergen, was ist dann der tatsächliche Unterschied zwischen diesen beiden? Ich konnte ihr keine Antwort geben.
Bevor ich diese Frage stelle, habe ich andere Threads auf StackOverFlow über den Unterschied zwischen diesen beiden OOP- Konzepten gelesen . Aber ich bin nicht in der Lage, den Interviewer zu überzeugen.
Kann jemand es bitte mit einem einfachsten Beispiel rechtfertigen?
quelle
Antworten:
Kapselung versteckt Variablen oder eine Implementierung, die in einer Klasse so oft geändert werden kann, um zu verhindern, dass Außenstehende direkt darauf zugreifen. Sie müssen über Getter- und Setter-Methoden darauf zugreifen.
Abstraktion wird verwendet, um etwas zu verbergen, jedoch in höherem Maße (Klasse, Schnittstelle) . Clients, die eine abstrakte Klasse (oder Schnittstelle) verwenden, kümmern sich nicht darum, wer oder was es war, sie müssen nur wissen, was sie kann.
quelle
Dieses Bild fasst den Unterschied zwischen beiden ziemlich gut zusammen:
Quelle hier
quelle
Abstraktion - ist der Prozess (und das Ergebnis dieses Prozesses) zum Identifizieren der gemeinsamen wesentlichen Merkmale für eine Reihe von Objekten. Man könnte sagen, dass Abstraktion der Prozess der Verallgemeinerung ist: Alle betrachteten Objekte sind in einer Obermenge von Objekten enthalten, die alle bestimmte Eigenschaften besitzen (sich aber in anderer Hinsicht unterscheiden).
Kapselung - ist der Prozess, bei dem Daten und Funktionen, die diese Daten bearbeiten, in einer einzigen Einheit zusammengefasst werden, um die interne Implementierung vor der Außenwelt zu verbergen.
Dies ist eine allgemeine Antwort, die sich nicht auf eine bestimmte Programmiersprache bezieht (wie es die Frage war). Die Antwort lautet also: Abstraktion und Kapselung haben nichts gemeinsam. Ihre Implementierungen können sich jedoch aufeinander beziehen (z. B. in Java: Kapselung - Details sind in einer Klasse verborgen, Abstraktion - Details sind in einer Klasse oder Schnittstelle überhaupt nicht vorhanden).
quelle
Kapselung: Code und Daten in einer Einheit zusammenfassen.
Class
ist ein Beispiel für die Kapselung, da sie die Methode und die Eigenschaft umschließt.Abstraktion: Interne Details ausblenden und nur Funktionalität anzeigen. Die Abstraktion konzentriert sich darauf, was das Objekt tut, anstatt wie es tut. Es bietet eine allgemeine Ansicht der Klassen.
Hier ist ToString () Abstraktion. Und wie diese Mechanismusvariable
number
in Zeichenfolge konvertiert und in initialisiert wird,aStringNumber
ist die Kapselung.Nehmen wir ein reales Beispiel für einen Taschenrechner. Die Kapselung besteht aus den internen Schaltkreisen, der Batterie usw., die zusammen einen Taschenrechner bilden. Abstraktion sind die verschiedenen Tasten wie Ein-Aus, Löschen und andere Tasten, die zur Bedienung bereitgestellt werden.
quelle
Abstraktion: Wird normalerweise durchgeführt, um einen polymorphen Zugriff auf eine Reihe von Klassen zu ermöglichen. Eine abstrakte Klasse kann nicht instanziiert werden, daher muss eine andere Klasse daraus abgeleitet werden, um eine konkretere Darstellung zu erstellen.
Ein allgemeines Verwendungsbeispiel für eine abstrakte Klasse kann die Implementierung eines Entwurfsmusters für Vorlagenmethoden sein, bei dem ein abstrakter Injektionspunkt eingeführt wird, damit die konkrete Klasse ihn auf ihre eigene "konkrete" Weise implementieren kann.
siehe: http://en.wikipedia.org/wiki/Abstraction_(computer_science)
Kapselung: Es ist der Prozess, bei dem die Implementierungskomplexität einer bestimmten Klasse vor dem Client verborgen wird, der sie verwenden wird. Beachten Sie, dass der "Client" ein Programm oder Ereignis sein kann, das die Person geschrieben hat.
siehe: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
quelle
Es gibt einen großartigen Artikel, der die Unterschiede zwischen Abstraktion, Kapselung und Informationen behandelt, die sich in der Tiefe verstecken: http://www.tonymarston.co.uk/php-mysql/abstraction.txt
Hier ist die Schlussfolgerung aus dem Artikel:
quelle
Der Unterschied zwischen beiden besteht darin, dass nur das View Point
Encapsulation-Wort zum Ausblenden von Daten verwendet wird, wenn wir verhindern möchten, dass der Kunde die Innenansicht unserer Logik sieht
Das Abstraktionswort wird zum Ausblenden von Daten verwendet, wenn unser Ziel darin besteht, unserem Kunden eine Außenansicht zu zeigen
Außenansicht bedeutet, dass wir annehmen
Hier verwenden wir Swap in Bubble Sort, um unserem Kunden nur zu zeigen, welche Logik wir anwenden. Wenn wir Swap (x, y) hier durch ganzen Code ersetzen, kann er / sie in einer einzelnen Instanz unsere Logik nicht verstehen
quelle
Ja, es ist wahr, dass es bei Abstraktion und Verkapselung darum geht, sich zu verstecken.
Das Verwenden nur relevanter Details und das Ausblenden unnötiger Daten auf Designebene wird als Abstraktion bezeichnet . (Als würde man nur relevante Eigenschaften für eine Klasse 'Auto' auswählen, um sie abstrakter oder allgemeiner zu gestalten.)
Kapselung ist das Ausblenden von Daten auf Implementierungsebene . Zum Beispiel, wie man Daten tatsächlich vor direktem / externem Zugriff verbirgt. Dies erfolgt durch Binden von Daten und Methoden an eine einzelne Entität / Einheit, um einen externen Zugriff zu verhindern. Daher wird die Kapselung auch als Verstecken von Daten auf Implementierungsebene bezeichnet.
quelle
Verkapselung:
Etwas verstecken, eine Art Medikamentenkapsel. Wir wissen nicht, was in der Kapsel ist, wir nehmen es einfach. Wie bei der Programmierung - wir verstecken nur einen speziellen Code für Methoden oder Eigenschaften und es wird nur eine Ausgabe ausgegeben, genau wie bei der Kapsel. Kurz gesagt, die Kapselung verbirgt Daten.
Abstraktion:
Abstraktion bedeutet, Logik oder Implementierung zu verbergen. Zum Beispiel nehmen wir Tabletten und sehen ihre Farbe und wissen aber nicht, was der Zweck davon ist und wie es mit dem Körper funktioniert.
quelle
Abstraktion
In Java bedeutet Abstraktion, die Informationen in der realen Welt zu verbergen. Es wird der Vertrag zwischen der Partei geschlossen, in dem festgelegt wird, „was wir tun sollen, um den Dienst zu nutzen“.
Beispiel: In der API-Entwicklung wurden der Welt nur abstrahierte Informationen des Dienstes offenbart, eher die tatsächliche Implementierung. Die Schnittstelle in Java kann dazu beitragen, dieses Konzept sehr gut zu erreichen.
Die Schnittstelle bietet einen Vertrag zwischen den Parteien, beispielsweise Hersteller und Verbraucher. Der Hersteller produziert die Waren, ohne den Verbraucher darüber zu informieren, wie das Produkt hergestellt wird. Über die Benutzeroberfläche ließ der Produzent jedoch alle Verbraucher wissen, welches Produkt er kaufen kann. Mit Hilfe der Abstraktion kann der Hersteller das Produkt an seine Verbraucher vermarkten.
Verkapselung:
Die Kapselung ist eine Abstraktionsebene tiefer. Dieselbe Produktfirma versucht, Informationen voneinander zu schützen. Wenn ein Unternehmen beispielsweise Wein und Schokolade herstellt, hilft die Einkapselung dabei, Informationen darüber abzuschirmen, wie jedes Produkt voneinander hergestellt wird.
quelle
Nur noch ein paar Punkte, um die Sache klar zu machen,
Man darf die Datenabstraktion und die abstrakte Klasse nicht verwechseln. Sie sind anders.
Im Allgemeinen sagen wir, dass abstrakte Klasse oder Methode darin besteht, etwas zu verbergen. Aber nein ... das ist falsch. Was bedeutet das Wort abstrakt? Laut Google-Suche bedeutet das englische Wort Abstraktion
"In Gedanken oder als Idee existieren, aber keine physische oder konkrete Existenz haben."
Und das gilt auch für den abstrakten Unterricht. Es verbirgt nicht den Inhalt der Methode, aber der Inhalt der Methode ist bereits leer (ohne physische oder konkrete Existenz), sondern bestimmt, wie eine Methode (in Gedanken oder als Idee vorhanden) oder eine Methode im Calss sein sollte .
Wann verwenden Sie tatsächlich abstrakte Methoden?
Also über abstrakte Klasse! - Eine Abstract-Klasse kann nicht nur erweitert instanziiert werden! Aber wieso ?
Eine abstrakte Klasse hilft uns zu vermeiden, eine neue Instanz davon zu erstellen!
Eine abstrakte Methode in einer Klasse zwingt die untergeordnete Klasse, diese Funktion mit der angegebenen Signatur sicher zu implementieren!
quelle
Lassen Sie es mich anhand des oben diskutierten Beispiels erklären. Bitte beachten Sie den gleichen Fernseher.
Kapselung : Die Einstellungen, die wir mit der Fernbedienung vornehmen können, sind ein gutes Beispiel. Lautstärke erhöhen / verringern, Farbe und Kontrast. Stellen Sie sich hier den Getter und den Setter vor (Die Setter-Funktion prüft, ob der angegebene Wert gültig ist, wenn Ja, sie verarbeitet den Vorgang, wenn nicht, können wir keine Änderungen vornehmen - so wie wir die Lautstärke nicht über Null verringern können, selbst wenn wir die Lautstärke verringern Knopf hundertmal).
Abstraktion : Wir können hier das gleiche Beispiel nehmen, jedoch mit einem höheren Grad / Kontext. Die Lautstärketaste verringert die Lautstärke - und dies sind die Informationen, die wir dem Benutzer zur Verfügung stellen. Dem Benutzer sind weder der Infrarotsender in der Fernbedienung noch der Empfänger im Fernsehgerät und der anschließende Prozess des Parsens des Signals und des Mikroprozessors bekannt Architektur im Fernseher. Einfach ausgedrückt, wird es im Kontext nicht benötigt - Geben Sie einfach an, was erforderlich ist. Man kann die Definition des Lehrbuchs hier leicht in Beziehung setzen, dh die innere Implementierung verbergen und nur angeben, was sie tun wird, anstatt wie sie das tut!
Hoffe es klärt ein bisschen!
quelle
Wenn ich derjenige bin, der sich dem Interview gestellt hat, würde ich sagen, dass Abstraktion und Kapselung in der Endbenutzerperspektive ziemlich gleich sind. Es ist nichts als Informationen, die sich verstecken. Aus Sicht der Softwareentwickler löst Abstraction die Probleme auf Entwurfsebene und Encapsulation das Problem auf Implementierungsebene
quelle
Kurz gesagt,
Abstraction
geschieht dies auf Klassenebene, indem die Implementierung ausgeblendet und eine Schnittstelle implementiert wird, um mit der Instanz der Klasse interagieren zu können. WirdEncapsulation
verwendet, um Informationen zu verbergen; B. die Mitgliedsvariablen privat machen, um den direkten Zugriff zu verbieten, und Getter und Setter für sie bereitstellen, um den korrekten Zugriff anzuzeigen.quelle
Abstraktion: Was sind die Mindestfunktionen und -variablen, die außerhalb unserer Klasse verfügbar sein sollten?
Kapselung: Wie wird diese Anforderung erreicht, dh wie wird sie implementiert?
quelle