Wie unterscheiden sich Abstraktion und Kapselung?

74

Ich bereite mich auf ein Interview vor und habe beschlossen, meine OOP-Konzepte aufzufrischen. Es gibt Hunderte von Artikeln, aber es scheint, dass jeder sie anders beschreibt. Einige sagen

Abstraktion ist "der Prozess der Identifizierung gemeinsamer Muster mit systematischen Variationen; eine Abstraktion stellt das gemeinsame Muster dar und bietet ein Mittel zur Angabe der zu verwendenden Variation" (Richard Gabriel).

und wird durch abstrakte Klassen erreicht.

Ein anderer sagt

Abstraktion bedeutet, dem Client des Objekts nur die erforderlichen Details anzuzeigen

und

Angenommen, Sie haben eine Methode "CalculateSalary" in Ihrer Employee-Klasse, die EmployeeId als Parameter verwendet und das Gehalt des Mitarbeiters für den aktuellen Monat als ganzzahligen Wert zurückgibt. Nun, wenn jemand diese Methode anwenden möchte. Er muss sich nicht darum kümmern, wie das Mitarbeiterobjekt das Gehalt berechnet. Ein einziges Anliegen ist der Name der Methode, ihre Eingabeparameter und das Format des resultierenden Mitglieds.

Ich habe immer wieder gegoogelt und keines der Ergebnisse scheint mir eine richtige Antwort zu geben. Wo passt nun die Kapselung in all diese? Ich suchte und fand eine Frage zum Stapelüberlauf . Auch die Antworten auf diese Fragen wurden verwirrend hier , sagt sie

Kapselung ist eine Strategie, die als Teil der Abstraktion verwendet wird. Kapselung bezieht sich auf den Zustand von Objekten - Objekte kapseln ihren Zustand und verbergen ihn von außen; Externe Benutzer der Klasse interagieren über ihre Methoden mit ihr, können jedoch nicht direkt auf den Klassenstatus zugreifen. Die Klasse abstrahiert also die Implementierungsdetails, die sich auf ihren Status beziehen.

Und hier sagt ein anderes angesehenes Mitglied:

Sie sind verschiedene Konzepte.

Bei der Abstraktion werden alle nicht benötigten / unwichtigen Attribute eines Objekts verfeinert und nur die für Ihre Domain am besten geeigneten Eigenschaften beibehalten.

Jetzt bin ich mit dem ganzen Konzept durcheinander. Ich kenne mich mit abstrakter Klasse, Vererbung, Zugriffsspezifizierern und allem aus. Ich möchte nur wissen, wie ich antworten soll, wenn ich in einem Interview nach Abstraktion und / oder Kapselung gefragt werde.

Bitte markieren Sie es nicht als Duplikat . Ich weiß, dass es mehrere ähnliche Fragen gibt. Aber ich möchte die Verwirrung zwischen den widersprüchlichen Erklärungen vermeiden. Kann jemand einen glaubwürdigen Link vorschlagen? Ein Link zur Stackoverflow-Frage ist ebenfalls willkommen, es sei denn, dies führt erneut zu Verwirrung. :) :)

EDIT: Ich brauche Antworten, ein bisschen c # orientiert

Aparan
quelle
4
Alle diese Antworten verwirren mich erneut :(
Aparan
3
Ich werde ein Kopfgeld für diese Frage bekommen.
Aparan
2
Das Problem ist, dass es für diese Konzepte keine genauen Definitionen gibt und die Wörter selbst selbst im Kontext der Objektorientierung mehrere Bedeutungen haben. Wenn Sie in einem Interview darüber sprechen, würde ich hoffen, dass dies ausreicht!
Matthew Watson
2
@ MatthewWatson: If you talk about that in an interview, I would hope that would be sufficient! Ich habe dich nicht verstanden.
Aparan
1
Ich hoffe, dieser Artikel würde eine etwas klare Vorstellung über den Unterschied der beiden geben ... :)
Neugier

Antworten:

50

Abstraktion bedeutet, dem Client des Objekts nur die erforderlichen Details anzuzeigen

Eigentlich ist das Kapselung. Siehe auch den ersten Teil des Wikipedia-Artikels, um nicht durch Kapselung und Verstecken von Daten verwirrt zu werden. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

Denken Sie daran, dass das einfache Verstecken aller Klassenmitglieder 1: 1 hinter Eigenschaften überhaupt keine Kapselung darstellt. Bei der Kapselung geht es darum, Invarianten zu schützen und Implementierungsdetails zu verbergen.

hier ein guter Artikel dazu. http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/ Schauen Sie sich auch die Artikel an, die in diesem Artikel verlinkt sind.

Klassen, Eigenschaften und Zugriffsmodifikatoren sind Werkzeuge zur Bereitstellung der Kapselung in c #.

Sie führen eine Kapselung durch, um die Komplexität zu verringern.

Abstraktion ist "der Prozess der Identifizierung gemeinsamer Muster mit systematischen Variationen; eine Abstraktion stellt das gemeinsame Muster dar und bietet ein Mittel zur Angabe der zu verwendenden Variation" (Richard Gabriel).

Ja, das ist eine gute Definition für Abstraktion.

Sie sind verschiedene Konzepte. Bei der Abstraktion werden alle nicht benötigten / unwichtigen Attribute eines Objekts verfeinert und nur die für Ihre Domain am besten geeigneten Eigenschaften beibehalten.

Ja, das sind verschiedene Konzepte. Denken Sie daran, dass Abstraktion eigentlich das Gegenteil davon ist, ein Objekt NUR für IHRE Domain geeignet zu machen. es ist, um das Objekt für die Domain im Allgemeinen geeignet zu machen!

Wenn Sie ein tatsächliches Problem haben und eine bestimmte Lösung bereitstellen, können Sie mithilfe der Abstraktion eine allgemeinere Lösung formalisieren, mit der auch mehr Probleme mit demselben gemeinsamen Muster gelöst werden können. Auf diese Weise können Sie die Wiederverwendbarkeit Ihrer Komponenten verbessern oder Komponenten verwenden, die von anderen Programmierern erstellt wurden, die für dieselbe Domäne oder sogar für verschiedene Domänen erstellt wurden.

Gute Beispiele sind Klassen, die vom .net-Framework bereitgestellt werden, z. B. Liste oder Sammlung. Dies sind sehr abstrakte Klassen, die Sie fast überall und in vielen Bereichen verwenden können. Stellen Sie sich vor, .net implementierte nur eine EmployeeList-Klasse und eine CompanyList, die nur eine Liste von Mitarbeitern und Unternehmen mit bestimmten Eigenschaften enthalten könnten. Solche Klassen wären in vielen Fällen nutzlos. und was für ein Schmerz wäre es, wenn Sie beispielsweise die gesamte Funktionalität für eine CarList neu implementieren müssten. Die "Liste" wird also von Mitarbeitern, Unternehmen und Autos ABSTRAKTIERT. Die Liste selbst ist ein abstraktes Konzept, das von einer eigenen Klasse implementiert werden kann.

Schnittstellen, abstrakte Klassen oder Vererbung und Polymorphismus sind Werkzeuge, um Abstraktion in c # bereitzustellen.

Sie führen eine Abstraktion durch, um die Wiederverwendbarkeit zu gewährleisten.

Egi
quelle
2
stackoverflow.com/a/8960961/2401223 Es heißtEncapsulation is a strategy used as part of abstraction
Aparan
Ich verstehe ... es gibt verschiedene Bedeutungen hinter der Abstraktion. Wikipedia unterscheidet sich auch zwischen "Abstraktion" und dem "Abstraktionsprinzip". Halten Sie sich an das, was Matthew Watson Ihnen in den Kommentaren gesagt hat: "Das Problem ist, dass es keine genauen Definitionen für diese Konzepte gibt und die Wörter selbst selbst im Kontext der Objektorientierung mehrere Bedeutungen haben." Solange du ihnen in einem Interview eine oder mehrere Bedeutungen geben kannst, wird alles in Ordnung sein :)
Egi
Vielen Dank. Ich werde diesem Rat folgen :)
Aparan
"List an sich ist ein abstraktes Konzept" - Ich denke, es weicht vom Programmierkonzept der Abstraktion ab, da die List-Klasse eine konkrete Klasse ist, wenn nicht eine Schnittstelle.
user30478
Das glaube ich nicht. Schnittstellen sind keine Abstraktionen, können es aber sein. Konkrete Klassen sind keine Abstraktionen, können es aber sein. blog.ploeh.dk/2010/12/02/Interfacesarenotabstractions Außerdem gibt es in .net eine IList-Schnittstelle. Sie könnten richtig gedacht sein, ich denke, ich verschmelze Abstraktionen in einer Domäne und Abstraktionen im Code.
Egi
94

Kapselung : Verstecken von Daten mithilfe von Gettern und Setzern usw.

Abstraktion : Ausblenden der Implementierung mithilfe abstrakter Klassen und Schnittstellen usw.

Taj
quelle
6
Die Anzahl der Up-Votes, die diese falsche Antwort erhalten hat, ist einfach unglaublich. Obwohl abstrakte Klassen keine Implementierung haben, ist ihr Zweck nicht Abstraktion . Ihr Zweck ist die Vererbung , ein völlig anderes Prinzip der objektorientierten Analyse und Gestaltung.
DisplayName
2
Wollen Sie damit sagen, dass wir ohne abstrakte Klasse oder Schnittstelle keine Abstraktion erreichen können? Dies ist definitiv eine sehr falsche Antwort.
Vikram
1
Jede Funktion ist eine Kapselung Prüfung dies auch überprüfen , das von Handy-Beispiel .
Shaijut
50

Beispiel für Abstraktion und Verkapselung Bildquelle

Abstraktion: wird durch die Bilder der Katze oben links und oben rechts dargestellt. Der Chirurg und die alte Dame haben das Tier unterschiedlich gestaltet (oder visualisiert). Auf die gleiche Weise würden Sie je nach Bedarf der Anwendung unterschiedliche Funktionen in die Cat-Klasse aufnehmen. Jede Katze hat eine Leber, eine Blase, ein Herz und eine Lunge. Wenn Ihre Katze jedoch nur schnurren muss, abstrahieren Sie die Katze Ihrer Anwendung zum Design oben links und nicht oben rechts.

Verkapselung: wird von der Katze umrissen, die auf dem Tisch steht. So sollte jeder außerhalb der Katze die Katze sehen . Sie brauchen sich keine Sorgen zu machen, ob die tatsächliche Implementierung der Katze oben links oder oben rechts oder sogar eine Kombination aus beiden ist.


PS: Gehen Sie hier auf dieselbe Frage, um die komplette Geschichte zu hören.

Anzeigename
quelle
7
Das beste visuelle Beispiel für Abstraktion in OOP, das ich bisher gefunden habe, danke
Ricardo Dias Morais
27

Ich werde versuchen, Verkapselung und Abstraktion auf einfache Weise zu demonstrieren. Mal sehen ..

  • Das Zusammenfassen von Daten und Funktionen in einer einzigen Einheit (Klasse genannt) wird als Kapselung bezeichnet. Kapselung, die Informationen zu einem Objekt enthält und verbirgt, z. B. interne Datenstrukturen und Code.

Verkapselung ist -

  • Komplexität verbergen,
  • Daten und Funktion zusammenbinden,
  • Komplizierte Methoden privat machen,
  • Instanzvariable privat machen,
  • Unnötige Daten und Funktionen vor dem Endbenutzer ausblenden.

Kapselung implementiert Abstraktion.

Und Abstraktion ist -

  • Zeigen, was notwendig ist,
  • Daten müssen vom Endbenutzer abstrahiert werden.

Sehen wir uns ein Beispiel an.

Das folgende Bild zeigt eine grafische Benutzeroberfläche mit "Kundendetails, die einer Datenbank hinzugefügt werden sollen".

GUI des Kundenbildschirms

Wenn wir uns das Bild ansehen, können wir sagen, dass wir eine Kundenklasse brauchen.

Schritt 1: Was braucht meine Kundenklasse?

dh

  • 2 Variablen zum Speichern des Kundencodes und des Kundennamens.

  • 1 Funktion zum Hinzufügen des Kundencodes und des Kundennamens zur Datenbank.

  namespace CustomerContent
    {
       public class Customer
       {
           public string CustomerCode = "";
           public string CustomerName = "";
           public void ADD()
           {
              //my DB code will go here
           }

Jetzt funktioniert nur die ADD-Methode hier nicht mehr alleine.

Schritt -2: Wie funktioniert die Validierung, ADD-Funktion?

Wir benötigen Datenbankverbindungscode und Validierungscode (zusätzliche Methoden).

     public bool Validate()
     {
    //Granular Customer Code and Name
    return true;
     }

     public bool CreateDBObject()
     {
    //DB Connection Code
    return true;
     }


class Program
{
   static void main(String[] args)
   {
     CustomerComponent.Customer obj = new CustomerComponent.Customer;

     obj.CustomerCode = "s001";
     obj.CustomerName = "Mac";

     obj.Validate();
     obj.CreateDBObject();

     obj.ADD();
    }
}

Jetzt müssen dem Endbenutzer die zusätzlichen Methoden ( Validate(); CreateDBObject()[Komplizierte und zusätzliche Methode]) nicht mehr angezeigt werden. Der Endbenutzer muss nur noch den Kundencode, den Kundennamen und die Schaltfläche HINZUFÜGEN sehen und kennen, mit denen der Datensatz hinzugefügt wird. Endbenutzer Es ist egal, wie die Daten zur Datenbank hinzugefügt werden.

Schritt -3: Private die zusätzlichen und komplizierten Methoden, die keine Interaktion des Endbenutzers beinhalten.

Wenn wir also diese komplizierte und zusätzliche Methode als privat anstatt öffentlich machen (dh diese Methoden ausblenden) und das obj.Validate(); obj.CreateDBObject();Hauptprogramm in der Klasse löschen, erreichen wir die Kapselung.

Mit anderen Worten: Die Vereinfachung der Schnittstelle zum Endbenutzer ist die Kapselung.

Der vollständige Code sieht nun wie folgt aus:

 namespace CustomerContent
 {
     public class Customer
     {
        public string CustomerCode = "";
        public string CustomerName = "";

        public void ADD()
        {
           //my DB code will go here
        }

        private bool Validate()
        {
           //Granular Customer Code and Name
           return true;
        }

        private bool CreateDBObject()
        {
           //DB Connection Code
           return true;
        }


  class Program
  {
     static void main(String[] args)
     {
        CustomerComponent.Customer obj = new CustomerComponent.Customer;

        obj.CustomerCode = "s001";

        obj.CustomerName = "Mac";

        obj.ADD();
   }
}

Zusammenfassung :

Schritt -1 : Was braucht meine Kundenklasse? ist Abstraktion .

Schritt -3 : Schritt -3: Private die zusätzlichen und komplizierten Methoden, die keine Interaktion des Endbenutzers beinhalten, sind Kapselung .

PS - Der obige Code ist hart und schnell.

UPDATE: Unter diesem Link befindet sich ein Video, in dem das Beispiel erläutert wird: Was ist der Unterschied zwischen Abstraktion und Verkapselung?

Sanchit
quelle
1
Wie wird Validate()und CreateDBObject()wird nun gerufen?
Varsha
Wie würden Sie anrufen Validate()und CreateDBObject()dann ... Ich stimme @varsha zu.
Krish
1
public void ADD() { Validate(); CreateDBObject(); }
Vikram
Irreführende Antwort.
user30478
10

Ich denke, es sind etwas andere Konzepte, aber oft werden sie zusammen angewendet. Die Kapselung ist eine Technik zum Ausblenden von Implementierungsdetails vor dem Aufrufer, während die Abstraktion eher eine Entwurfsphilosophie ist, bei der Objekte erstellt werden, die mit bekannten Objekten / Prozessen vergleichbar sind, um das Verständnis zu erleichtern. Die Kapselung ist nur eine von vielen Techniken, mit denen eine Abstraktion erstellt werden kann.

Nehmen Sie zum Beispiel "Windows". Sie sind keine 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 darüber verbirgt, wie der Text oder die Grafiken innerhalb der Grenzen eines Fensters physisch gerendert werden, ist dies eine Kapselung.

Mike Panter
quelle
Können Sie eine Quelle für Ihr Konzept angeben?
Aparan
Diese Wikipedia-Seite: http://en.wikipedia.org/wiki/Abstraction_(computer_science) enthält ein gutes Beispiel in Java mit einer Klasse namens "animal", die eine Abstraktion ist. Die Klasse fasst die Tatsache zusammen, dass ein Tier "EnergyReserves" hat - der Anrufer muss dies nicht wissen. Stattdessen weiß der Anrufer einfach, ob das Tier "unheimlich" ist. EnergyReserves ist ausgeblendet (gekapselt).
Mike Panter
Dies ist die Antwort, für die ich stimmen werde. Aber das Abstraktionsbeispiel ist für mich nicht sehr aufschlussreich, da ich erwartet hatte, einige abstrakte Klassen- oder Schnittstellenmaterialien zu sehen, nicht die allgemeine englische Idee der Abstraktion.
user30478
10

Nachfolgend finden Sie einen semesterlangen Kurs, der in einigen Absätzen zusammengefasst ist.

Objektorientierte Analyse und Design (OOAD) basiert tatsächlich nicht nur auf zwei, sondern auf vier Prinzipien. Sie sind:

  • Abstraktion: bedeutet, dass Sie nur die Funktionen einer Entität einbeziehen, die in Ihrer Anwendung erforderlich sind. Wenn also jedes Bankkonto ein Eröffnungsdatum hat, Ihre Anwendung jedoch das Eröffnungsdatum eines Kontos nicht kennen muss, fügen Sie das Feld OpeningDate einfach nicht in Ihr objektorientiertes Design (der BankAccount-Klasse) ein. † Die Abstraktion in OOAD hat nichts mit abstrakten Klassen in OOP zu tun.

    Nach dem Prinzip der Abstraktion sind Ihre Entitäten eine Abstraktion dessen, was sie in der realen Welt sind. Auf diese Weise entwerfen Sie eine Abstraktion des Bankkontos nur bis zu dem Detaillierungsgrad, der von Ihrer Anwendung benötigt wird.

  • Vererbung: ist eher ein Codierungstrick als ein tatsächliches Prinzip. Es erspart Ihnen das Umschreiben der Funktionen, die Sie an einer anderen Stelle geschrieben haben. Es wird jedoch davon ausgegangen, dass eine Beziehung zwischen dem neuen Code, den Sie schreiben, und dem alten Code besteht, den Sie wiederverwenden möchten. Andernfalls hindert Sie niemand daran, eine Animal- Klasse zu schreiben, die von BankAccount erbt , auch wenn sie völlig unsinnig ist.

    So wie Sie möglicherweise das Vermögen Ihrer Eltern erben, können Sie auch Felder und Methoden von Ihrer Elternklasse erben. Es ist also Vererbung, alles zu nehmen, was die Elternklasse hat, und dann bei Bedarf etwas mehr hinzuzufügen. Suchen Sie nicht nach Vererbung in Ihrem objektorientierten Design. Vererbung wird sich natürlich präsentieren.

  • Polymorphismus: ist eine Folge der Vererbung. Das Erben einer Methode vom übergeordneten Element ist nützlich, aber die Möglichkeit, eine Methode zu ändern, wenn die Situation dies erfordert, ist Polymorphismus. Sie können eine Methode in der Unterklasse mit genau der gleichen Signatur wie in der übergeordneten Klasse implementieren, sodass beim Aufruf die Methode aus der untergeordneten Klasse ausgeführt wird. Dies ist das Prinzip des Polymorphismus.

  • Kapselung: bedeutet, die zugehörigen Funktionen zu bündeln und nur den Notwendigen Zugriff zu gewähren . Die Kapselung ist die Grundlage für eine aussagekräftige Klassengestaltung im objektorientierten Design durch:

    • Zusammenstellung verwandter Daten und Methoden; und,
    • Offenlegung nur der Daten und Methoden, die für die Zusammenarbeit mit externen Stellen relevant sind.

Eine weitere vereinfachte Antwort finden Sie hier .


Leute, die argumentieren, dass"Abstraktion von OOAD zum abstrakten Schlüsselwort von OOP führt" ...Nun, das ist falsch.

Beispiel: Wenn Sie eine Universität in einer Anwendung nach objektorientierten Prinzipien entwerfen, entwerfen Sie nur eine "Abstraktion" der Universität. Obwohl es in der Regel an fast jeder Universität einen Geldautomaten gibt, können Sie diese Tatsache möglicherweise nicht berücksichtigen, wenn sie für Ihre Bewerbung nicht benötigt wird. Und jetzt, obwohl Sie nur eine Abstraktion der Universität entworfen haben, müssen Sie abstractIhre Klassenerklärung nicht mehr einreichen. Ihr abstraktes Design der Universität wird eine normale Klasse in Ihrer Bewerbung sein.

Anzeigename
quelle
4

mein 2c

Der Zweck der Kapselung besteht darin, Implementierungsdetails vor dem Benutzer Ihrer Klasse zu verbergen, z. B. wenn Sie intern eine std :: -Liste von Elementen in Ihrer Klasse führen und dann entscheiden, dass ein std :: -Vektor effektiver ist, können Sie dies ohne den Benutzer ändern Pflege. Die Art und Weise, wie Sie mit einem der beiden stl-Container interagieren, ist der Abstraktion zu verdanken. Sowohl die Liste als auch der Vektor können beispielsweise mit ähnlichen Methoden (Iteratoren) auf dieselbe Weise durchlaufen werden.

AndersK
quelle
2
Bei allem Respekt werde ich mich an meine Erklärung halten :) dh das Einschließen des Versteckens vor dem Benutzer, die Abstraktion eher ein gemeinsames Konzept wie eine Schnittstelle, die mehrere Klassen gemeinsam haben.
AndersK
1
Hm .. Das habe ich in meiner Frage selbst gesagt. Jeder hat seine eigenen Konzepte zu diesem Thema :). Können Sie einen glaubwürdigen Link zur Unterstützung Ihrer Erklärung bereitstellen?
Aparan
Nein, ich habe keinen Link. So habe ich ihn aus verschiedenen Büchern wie Code Complete verstanden.
AndersK
c-sharpcorner.com/UploadFile/tusharkantagarwal/… Bitte überprüfen Sie diese beiden Links und sagen Sie mir, was ich akzeptieren soll
Aparan
3

Ein Beispiel wurde mir immer im Zusammenhang mit der Abstraktion vorgebracht; das automatische vs. manuelle Getriebe bei Autos. Das Schaltgetriebe verbirgt einige Funktionen des Gangwechsels, aber Sie müssen als Fahrer immer noch kuppeln und schalten. Das Automatikgetriebe kapselt alle Details des Gangwechsels, dh verbirgt es vor Ihnen, und ist daher eine höhere Abstraktion des Prozesses des Gangwechsels.

Lorentz Vedeler
quelle
"Automatikgetriebe kapselt alle Details des Gangwechsels, dh verbirgt es vor Ihnen" ... eigentlich würde ich deshalb sagen, dass das Automatik- oder Handschaltgetriebe bei Autos ein gutes Beispiel für ENCAPSULATION ist! und nicht zur Abstraktion. Automatikgetriebe ist keine Abstraktion des Schaltgetriebes, sondern ein anderes Konzept. Eine Abstraktion wäre, wenn Sie sagen, dass ein Auto ein Kraftübertragungssystem benötigt, das ignoriert, wie die tatsächliche Schnittstelle für den Fahrer sein wird (automatisch oder manuell).
Egi
Ich verstehe dein Argument. So wie ich es sehe, hängen Abstraktion und Kapselung zusammen. Wenn Sie keine Kapselung haben, haben Sie keine Abstraktion. Durch die Kapselung können Sie abstraktere Konzepte finden, sodass das Automatikgetriebe eine bessere Abstraktion ist als das manuelle Getriebe. Vielleicht brauchen Sie nicht einmal ein Konzept für die Übertragung, vielleicht brauchen Sie nur das Konzept eines sich vorwärts bewegenden Autos, das alle internen Funktionen des Autos zusammenfasst.
Lorentz Vedeler
1
Ich stimme Ihrer letzten Aussage absolut zu. Sie können alles weg abstrahieren, bis niemand mehr weiß, worum es eigentlich geht. aber ich bin mit Ihrer ersten Aussage nicht einverstanden. Sie können die Kapselung ohne Abstraktion üben, indem Sie beispielsweise ein Programm mit nur einer großen Klasse erstellen, das alles handhabt und alle Implementierungsdetails vor dem Client verbirgt. Eine Abstraktion ohne Kapselung ist auch möglich, indem ein Programm aus Klassen erstellt wird, die klein sind und eine einzige Verantwortung haben, jedoch keine Implementierungsdetails oder ungültigen Zustände verbergen.
Egi
1

Kapselung: Ausblenden von Implementierungsdetails (HINWEIS: Daten- und / oder ODER-Methoden), sodass nur das zugänglich ist, was für externe Personen sinnvoll lesbar / beschreibbar / verwendbar ist. Alles andere ist direkt "unantastbar".

Abstraktion: Dies bezieht sich manchmal speziell auf einen Typ, der nicht instanziiert werden kann und der eine Vorlage für andere Typen bereitstellt, die normalerweise über Unterklassen möglich sind. Allgemeiner bezieht sich "Abstraktion" darauf, etwas zu machen / zu haben, das weniger detailliert, weniger spezifisch und weniger detailliert ist.

Es gibt einige Ähnlichkeiten, Überschneidungen zwischen den Konzepten, aber die beste Art, sich daran zu erinnern, ist folgende: Bei der Kapselung geht es mehr darum, die Details zu verbergen , während bei der Abstraktion eher die Details verallgemeinert werden .

Brad Thomas
quelle
1

Abstraktion und Verkapselung sind verwirrende Begriffe und voneinander abhängig. Nehmen wir ein Beispiel:

public class Person
    {
        private int Id { get; set; }
        private string Name { get; set; }
        private string CustomName()
        {
            return "Name:- " + Name + " and Id is:- " + Id;
        }
    }

Beim Erstellen der Personenklasse haben Sie die Kapselung durchgeführt, indem Sie Eigenschaften und Funktionen zusammen geschrieben haben (ID, Name, Benutzerdefinierter Name). Sie führen eine Abstraktion durch, wenn Sie diese Klasse dem Client als verfügbar machen

Person p = new Person();
p.CustomName();

Ihr Kunde weiß in dieser Funktion nichts über ID und Name. Wenn nun, möchte Ihr Client auch den Nachnamen wissen, ohne den Funktionsaufruf zu stören. Sie führen die Kapselung durch, indem Sie der Person-Klasse wie folgt eine weitere Eigenschaft hinzufügen.

public class Person
        {
            private int Id { get; set; }
            private string Name { get; set; }
            private string LastName {get; set;}
            public string CustomName()
            {
                return "Name:- " + Name + " and Id is:- " + Id + "last name:- " + LastName;
            }
        }

Selbst nach dem Hinzufügen einer zusätzlichen Eigenschaft in der Klasse weiß Ihr Client nicht, was Sie mit Ihrem Code gemacht haben. Hier haben Sie die Abstraktion durchgeführt.

CredibleAshok
quelle
0

Wie ich weiß, verbirgt die Kapselung Daten von Klassen in sich selbst und macht sie nur über Setter / Getter zugänglich, wenn von der Außenwelt aus auf sie zugegriffen werden muss.

Abstraktion ist das Klassendesign für sich.

Bedeutet, wie Sie Ihren Klassenbaum erstellen, welche Methoden allgemein sind, welche geerbt werden, welche überschrieben werden können, welche Attribute nur auf privater Ebene oder geschützt sind, wie Sie Ihren Klassenvererbungsbaum aufbauen, verwenden Sie final Klassen, abstrakte Klassen, Schnittstellenimplementierung.

Die Abstraktion ist eher in der Oo-Design-Phase angesiedelt, während die Einkapselung auch in die Entwicklungsphase eintritt.

icbytes
quelle
0

Ich denke so, die Kapselung verbirgt die Art und Weise, wie etwas getan wird. Dies können eine oder mehrere Aktionen sein.

Abstraktion hängt mit dem "Warum" zusammen, das ich an erster Stelle einkapsele.

Grundsätzlich sage ich dem Kunden: "Sie müssen nicht viel darüber wissen, wie ich die Zahlung verarbeite und den Versand berechne usw. Ich möchte nur, dass Sie mir sagen, dass Sie zur Kasse gehen möchten, und ich werde mich um die Details für Sie kümmern." . "

Auf diese Weise habe ich die Details durch Verallgemeinern (Abstrahieren) in die Checkout-Anfrage gekapselt.

Ich denke wirklich, dass Abstraktion und Kapselung zusammenpassen.

FrankO
quelle
0

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 dem Verbraucher mitzuteilen, 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.

  1. Wenn ich ein einzelnes Paket für Wein und ein anderes für Schokolade habe und alle Klassen im Paket als Standardzugriffsmodifikator deklariert sind, geben wir die Kapselung auf Paketebene für alle Klassen an.
  2. Wenn wir in einem Paket jede abgelegte Klasse (Mitgliedsfeld) als privat deklarieren und über eine öffentliche Methode für den Zugriff auf diese Felder verfügen, können diese Felder auf diese Weise gekapselt werden
Shaan
quelle