Ich bereite mich auf ein Vorstellungsgespräch vor und habe beschlossen, meine OOP-Konzepte aufzufrischen. Es gibt Hunderte von Artikeln, aber es scheint, dass jeder Artikel sie anders beschreibt. Einige sagen
Abstraktion ist "der Prozess der Identifizierung von gemeinsamen Mustern, die
systematische Variationen; eine Abstraktion repräsentiert das gemeinsame Muster und bietet ein Mittel zur Spezifizierung der zu verwendenden Variation" (Richard Gabriel).
und wird durch abstrakte Klassen erreicht.
Einige andere sagt
Abstraktion bedeutet, dem Kunden nur die notwendigen Details des das Objekt
und
Angenommen, Sie haben eine Methode "CalculateSalary" in Ihrer Employee-Klasse, die EmployeeId als Parameter nimmt und das Gehalt des Angestellten für den aktuellen Monat als Integer-Wert zurückgibt. Wenn nun jemand diese Methode verwenden möchte. Er muss sich nicht darum kümmern, wie das Employee Objekt das Gehalt berechnet? Eine einzige Sache, die er braucht, ist Name der Methode, ihre Eingabeparameter und das Format des Ergebnisses Mitglied,
Ich habe wieder und wieder gegoogelt, aber keines der Ergebnisse scheint mir eine richtige Antwort zu geben. Nun, wo passt die Kapselung in all dies? Ich suchte und fand eine Stack Overflow-Frage. Selbst die Antworten auf diese Frage waren verwirrend Hier heißt es
Verkapselung ist eine Strategie, die als Teil der Abstraktion verwendet wird. Verkapselung
bezieht sich auf den Zustand von Objekten - Objekte kapseln ihren Zustand und verbergen ihn vor der Außenwelt; externe Benutzer der Klasse interagieren mit ihm durch ihre Methoden, können aber nicht direkt auf den Zustand der Klasse zugreifen. Also abstrahiert die Klasse die Implementierungsdetails, die mit ihrem Zustand.
Und hier sagt ein anderes namhaftes Mitglied,
Es sind unterschiedliche Konzepte.
Abstraktion ist der Prozess der Verfeinerung weg alle nicht benötigte/unwichtige Attribute eines Objekts zu entfernen und nur die Eigenschaften, die für Ihren Bereich am besten geeignet sind.
Jetzt bin ich durcheinander mit dem ganzen Konzept. Ich weiß über abstrakte Klasse, Vererbung, Zugriffsspezifizierer und all das Bescheid. Ich möchte nur wissen, wie ich antworten soll, wenn ich in einem Vorstellungsgespräch nach Abstraktion und/oder Kapselung gefragt werde.
*Bitte markieren Sie dies nicht als Duplikat. Ich weiß, dass es mehrere ähnliche Fragen gibt. Aber ich möchte die Verwirrung durch die widersprüchlichen Erklärungen vermeiden. Kann jemand einen glaubwürdigen Link vorschlagen? Ein Link zu einer Stackoverflow-Frage ist ebenfalls willkommen, es sei denn, er stiftet erneut Verwirrung :)
EDIT: Ich brauche Antworten, ein bisschen c# orientiert
Einkapselung: Verbergen von Daten mit Gettern und Settern usw.
Abstraktion: Verbergen der Implementierung durch abstrakte Klassen und Schnittstellen usw.
Meiner Meinung nach handelt es sich dabei um leicht unterschiedliche Konzepte, die jedoch häufig zusammen angewendet werden. Kapselung ist eine Technik, um Implementierungsdetails vor dem Aufrufer zu verbergen, während Abstraktion eher eine Entwurfsphilosophie ist, bei der es darum geht, Objekte zu schaffen, die bekannten Objekten/Prozessen ähneln, um das Verständnis zu erleichtern. Die Kapselung ist nur eine von vielen Techniken, die zur Schaffung einer Abstraktion verwendet werden können.
Nehmen wir zum Beispiel "Fenster". Sie sind nicht wirklich Fenster im herkömmlichen Sinne, sondern nur grafische Quadrate auf dem Bildschirm. Aber es ist nützlich, sie als Fenster zu betrachten. Das ist eine Abstraktion.
Wenn die "Windows-API" die Details verbirgt, wie der Text oder die Grafik innerhalb der Grenzen eines Fensters physisch dargestellt wird, ist das eine Kapselung.
Wie ich weiß, bedeutet Kapselung, dass Daten von Klassen in sich selbst versteckt werden und nur dann über Setter/Getter zugänglich gemacht werden, wenn von außen auf sie zugegriffen werden muss.
Abstraktion ist das Design der Klasse für sich selbst.
Das bedeutet, wie man den Klassenbaum aufbaut, welche Methoden allgemein sind, welche vererbt werden, welche überschrieben werden können, welche Attribute nur auf privater Ebene oder auf geschützter Ebene sind, wie man den Klassenvererbungsbaum aufbaut, ob man finale Klassen, abstrakte Klassen, Schnittstellenimplementierung verwendet.
Die Abstraktion ist eher in der Entwurfsphase angesiedelt, während die Kapselung auch in die Entwicklungsphase einfließt.