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
quelle
If you talk about that in an interview, I would hope that would be sufficient!
Ich habe dich nicht verstanden.Antworten:
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.
Ja, das ist eine gute Definition für Abstraktion.
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.
quelle
Encapsulation is a strategy used as part of abstraction
Kapselung : Verstecken von Daten mithilfe von Gettern und Setzern usw.
Abstraktion : Ausblenden der Implementierung mithilfe abstrakter Klassen und Schnittstellen usw.
quelle
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.
quelle
Ich werde versuchen, Verkapselung und Abstraktion auf einfache Weise zu demonstrieren. Mal sehen ..
Verkapselung ist -
Kapselung implementiert Abstraktion.
Und Abstraktion ist -
Sehen wir uns ein Beispiel an.
Das folgende Bild zeigt eine grafische Benutzeroberfläche mit "Kundendetails, die einer Datenbank hinzugefügt werden sollen".
Wenn wir uns das Bild ansehen, können wir sagen, dass wir eine Kundenklasse brauchen.
Schritt 1: Was braucht meine Kundenklasse?
dh
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?
quelle
Validate()
undCreateDBObject()
wird nun gerufen?Validate()
undCreateDBObject()
dann ... Ich stimme @varsha zu.public void ADD() { Validate(); CreateDBObject(); }
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.
quelle
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:
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.
quelle
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.
quelle
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.
quelle
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 .
quelle
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.
quelle
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.
quelle
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.
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 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.
quelle