Einfacher Weg, um Kapselung und Abstraktion zu verstehen

73

Erlernen von OOP-Konzepten, die besonders daran interessiert sind, Abstraktion und Verkapselung eingehend zu verstehen.

Schaut euch das unten schon an

Abstraktion VS Information Versteckt VS Kapselung

Unterschied zwischen Abstraktion und Kapselung?

Es fiel mir sehr schwer, diese Konzepte ohne ein reales und einfaches Beispiel für einen Klassen- / Code-Ausschnitt zu verstehen.

Einer meiner Kollegen sagte, Abstraktion sei nichts anderes als das Erstellen einer abstrakten Klasse und einer normalen Klasse, die ihre Mitgliedsvariable mit dem Gültigkeitsbereich schützt, heißt Encapsulation.

Gibt es eine einfache Möglichkeit, andere zu verstehen und ihnen zu helfen, zu verstehen, was sie genau sind, anstatt das Folgende zu wiederholen?

Abstraktion und Kapselung sind komplementäre Konzepte: Abstraktion konzentriert sich auf das beobachtbare Verhalten eines Objekts ... Kapselung konzentriert sich auf die Implementierung, die zu diesem Verhalten führt ... Kapselung wird meistens durch Verstecken von Informationen erreicht, dh durch das Verstecken aller die Geheimnisse des Objekts, die nicht zu seinen wesentlichen Eigenschaften beitragen.

Billa
quelle
Was genau finden Sie an dieser Beschreibung verwirrend?
Joseph Mansfield
1
Übrigens, warum muss alles einfach sein?
Gdoron unterstützt Monica
1
Abstraktion ist Abstraktion - aber Kapselung hat nichts mit Abstraktion zu tun. Es bedeutet, Daten und Logik zu behalten, um diese Daten im selben Objekt (Klasse) zu verwalten.
Serghei
@sftrabbit, ich kann nicht verstehen, was für ein beobachtbares Verhalten der Klasse, das wir als abstrakt und Implementierung bezeichnen, das zu diesem Verhalten führt?
Billa

Antworten:

170

Abstraktion ist ein Prozess, bei dem Sie nur "relevante" Daten anzeigen und unnötige Details eines Objekts vor dem Benutzer "verbergen". Betrachten Sie Ihr Mobiltelefon, Sie müssen nur wissen, welche Tasten gedrückt werden müssen, um eine Nachricht zu senden oder einen Anruf zu tätigen. Was passiert, wenn Sie eine Taste drücken, wie Ihre Nachrichten gesendet werden, wie Ihre Anrufe verbunden sind, ist alles von der entfernt Nutzer.

Bei der Kapselung werden Daten und Funktionen zu einer Einheit zusammengefasst, die als Klasse bezeichnet wird. In der Kapselung wird nicht direkt auf die Daten zugegriffen. Der Zugriff erfolgt über die in der Klasse vorhandenen Funktionen. In einfacheren Worten werden Attribute der Klasse privat gehalten und öffentliche Getter- und Setter-Methoden bereitgestellt, um diese Attribute zu manipulieren. Die Kapselung ermöglicht somit das Konzept des Versteckens von Daten.

Geben Sie hier die Bildbeschreibung ein

Yasser Shaikh
quelle
1
'... nur "relevante" Daten anzeigen und unnötige Details "verbergen" ...' , das Wort "Daten" in der Erklärung der Abstraktion kann etwas täuschen, da es bei der Abstraktion eher darum geht, nur relevante Merkmale (Funktionen, wenn Sie so wollen, darzustellen) ). Dieser Punkt wird durch das Beispiel mit dem Mobiltelefon und seinen Funktionen
Das beigefügte Bild gibt eine ziemlich gute Vorstellung davon, was was ist =)
Sie können auch ein c #abstraction
-Beispiel
28

Durch Abstraktion werden die Informationen ausgeblendet oder dem Kunden nur die erforderlichen Details zur Verfügung gestellt.

zB Auto-Bremsen - Sie wissen nur, dass das Drücken der Pedale das Fahrzeug stoppt, aber Sie müssen nicht wissen, wie es intern funktioniert.

Vorteil der Abstraktion Morgen, wenn sich die Bremsimplementierung von Trommelbremse zu Scheibenbremse ändert, müssen Sie als Client keine Änderungen vornehmen (dh Ihr Code ändert sich nicht).

Die Kapselung bindet die Daten und Verhaltensweisen in einer Einheit zusammen. Es ist auch ein Sprachmechanismus zum Einschränken des Zugriffs auf einige Komponenten (dies kann durch Zugriffsmodifikatoren wie privat, geschützt usw. erreicht werden).

Zum Beispiel hat die Klasse Attribute (dh Daten) und Verhaltensweisen (dh Methoden, die mit diesen Daten arbeiten).

Jaydeep Rajput
quelle
Dies bedeutet, dass wir die Abstraktion konzeptionell verstehen, anstatt das abstractSchlüsselwort für eine Methode oder eine Klasse zu definieren. Richtig?
Billa
2
Richtig. OOP ist eine Philosophie und sprachneutral.
Jaydeep Rajput
1
Ein gutes Beispiel für die Kapselung ist die Verwendung von Gettern und Setzern. Sie weisen einer privaten Eigenschaft einer Instanz einer Klasse (eines Objekts) über die Setter-Methode einen Wert zu (z. B. setName("john")wo setName(firstName)ist eine öffentliche Methode, die enthält, _firstName = firstNamewo _firstNameist eine private Eigenschaft).
Wachs
2
Oder, ..., Kapselung ist eine Möglichkeit, Abstraktion zu implementieren?
Andrew
Die beste Erklärung
Rinto George
13

Ein Beispiel mit C #

//abstraction - exposing only the relevant behavior
public interface IMakeFire
{
     void LightFire();
}

//encapsulation - hiding things that the rest of the world doesn't need to see
public class Caveman: IMakeFire
{
     //exposed information  
     public string Name {get;set;}

     // exposed but unchangeable information
     public byte Age {get; private set;}

     //internal i.e hidden object detail. This can be changed freely, the outside world
     // doesn't know about it
     private bool CanMakeFire()
     {  
         return Age >7;
     }

     //implementation of a relevant feature
     public void LightFire()
     {
        if (!CanMakeFire())
        {
           throw new UnableToLightFireException("Too young");
        }
        GatherWood();
        GetFireStone();
        //light the fire

     }

     private GatherWood() {};
     private GetFireStone();
}

public class PersonWithMatch:IMakeFire
{
      //implementation
 }

Jeder Höhlenmensch kann ein Feuer machen, da er die IMakeFire -Funktion implementiert . Mit einer Gruppe von Feuerwehrleuten (Liste) bedeutet dies, dass sowohl Caveman als auch PersonWithMatch gültige Optionen sind.

Das bedeutet, dass

  //this method (and class) isn't coupled to a Caveman or a PersonWithMatch
  // it can work with ANY object implementing IMakeFire
  public void FireStarter(IMakeFire starter)
  {
        starter.LightFire();
    }

Sie können also viele Implementierer mit vielen Details (Eigenschaften) und Verhalten (Methoden) haben, aber in diesem Szenario ist ihre Fähigkeit, Feuer zu machen, wichtig. Das ist Abstraktion.

Da für das Feuern einige Schritte erforderlich sind (GetWood usw.), sind diese nicht sichtbar, da sie ein internes Anliegen der Klasse sind. Der Höhlenmensch hat viele andere öffentliche Verhaltensweisen, die von der Außenwelt genannt werden können. Einige Details werden jedoch immer ausgeblendet, da sie sich auf die interne Arbeit beziehen. Sie sind privat und existieren nur für das Objekt, sie werden niemals ausgesetzt. Dies ist die Kapselung

MikeSW
quelle
9

Abstraktion ist ein allgemeiner Begriff. dh die Kapselung ist eine Teilmenge der Abstraktion.

Abstraktion ist eine leistungsstarke Methode zur Verwaltung komplexer Systeme. Die Abstraktion wird durch genau definierte Objekte und deren hierarchische Klassifizierung verwaltet.

Zum Beispiel ist ein Auto an sich ein genau definiertes Objekt, das sich aus mehreren anderen kleineren Objekten wie einem Getriebesystem, einem Lenkmechanismus und einem Motor zusammensetzt, die wiederum ihre eigenen Subsysteme haben. Für den Menschen ist das Auto jedoch ein einziges Objekt, das mithilfe seiner Subsysteme verwaltet werden kann, auch wenn ihre inneren Details unbekannt sind. Höflichkeit


Kapselung: Das Zusammenfassen von Datenelement und Methode zu einer einzigen Einheit (dh Klasse) wird als Kapselung bezeichnet.

Die Einkapselung ist wie das Einschließen in eine Kapsel. Das heißt, die zugehörigen Operationen und Daten, die sich auf ein Objekt beziehen, werden in dieses Objekt eingeschlossen.

Die Kapselung ist wie Ihre Tasche, in der Sie Ihren Stift, Ihr Buch usw. aufbewahren können. Dies bedeutet, dass dies die Eigenschaft der Kapselung von Elementen und Funktionen ist.

class Bag{
    book;
    pen;
    ReadBook();
}

Kapselung bedeutet, die internen Details eines Objekts zu verbergen, dh wie ein Objekt etwas tut.

Die Kapselung verhindert, dass Clients die Innenansicht sehen, in der das Verhalten der Abstraktion implementiert ist.

Die Kapselung ist eine Technik, mit der die Informationen in einem Objekt vor dem anderen Objekt geschützt werden.

Blenden Sie die Daten aus Sicherheitsgründen aus, z. B. indem Sie die Variablen als privat festlegen, und machen Sie die Eigenschaft verfügbar, um auf die privaten Daten zuzugreifen, die öffentlich wären.

Wenn Sie also auf die Eigenschaft zugreifen, können Sie die Daten validieren und festlegen. Höflichkeit

Premraj
quelle
5

Nun, ich werde die Abstraktion anhand eines Beispiels aus der Praxis erklären. Angenommen, Sie haben in Ihrem Haus einen elektrischen Stecker und viele Geräte können an denselben Stecker angeschlossen werden, aber der Stecker hat nie eine Vorstellung davon, an welches Gerät er angeschlossen ist. Mit anderen Worten, die Details der Geräte werden vom Stecker abstrahiert (versteckt).

Überlegen Sie, was passiert, wenn wir ein Gerät ohne Stecker direkt an ein elektrisches Kabel anschließen? Nehmen wir an, Sie schließen eine Glühbirne direkt an ein Kabel an, dann weiß das Kabel, an welches Gerät es angeschlossen ist, und wenn wir die Glühbirne ersetzen müssen, müssen wir die Kabelverbindung von der Glühbirne entfernen, was bedeutet, dass die Glühbirne fest mit dem Kabel verbunden ist. Mit anderen Worten, Glühbirne und Draht kennen die Details, mit denen sie verbunden sind, dh nicht abstrahiert.

In der objektorientierten Welt funktioniert die Abstraktion genauso. Die Klasse, die die Funktion / Eigenschaft anderer Klassen verwendet, muss nicht wissen, welche Klassenfunktion / -eigenschaft sie verwendet, und alles sollte mit einer Schnittstelle / abstrakten Klasse abstrahiert werden.

Lassen Sie mich das gleiche Beispiel codieren. Hier habe ich eine Klasse "ElectricPlug", auf der ein Gerät läuft. Die Klasse "ElectricPlug" hat jedoch keine Ahnung, auf welchem ​​Gerät sie ausgeführt wird. Es kann sich um eine beliebige Klasse handeln, die die Schnittstelle "IDevice" implementiert. Dies bedeutet, dass die Implementierung von "RunDevice" von "ElectricPlug" abstrahiert wird. Hier ist der vollständige Beispielcode:

class Program
{
    static void Main(string[] args)
    {
        ElectricPlug electricPlug = new ElectricPlug(new Bulb());
    }
}

public class ElectricPlug
{
    private readonly IDevice _device;
    public ElectricPlug(IDevice device)
    {
        _device = device;
    }

    public void Run()
    {
        _device.Rundevice();
    }
}


public interface IDevice
{
    void Rundevice();
}


public class Bulb : IDevice
{
    public void Rundevice()
    {
       Console.WriteLine("Switched on bulb");
    }
}
Vijayanath Viswanathan
quelle
4

Abstraktion ist der Prozess, bei dem Sie unnötige Details von einer Entität "wegwerfen", die Sie in Ihrem Entwurf erfassen / darstellen möchten, und nur die Eigenschaften der Entität beibehalten, die für Ihre Domain relevant sind.
Beispiel: Um ein Auto darzustellen, würden Sie z. B. das Modell und den Preis, den aktuellen Standort und die aktuelle Geschwindigkeit beibehalten und Farbe und Anzahl der Sitze usw. ignorieren.

Kapselung ist die "Bindung" der Eigenschaften und der Operationen, die sie in einer einzelnen Abstraktionseinheit (nämlich einer Klasse) manipulieren.
Das Auto müsste accelarate stopalso den Standort und die aktuelle Geschwindigkeit usw. manipulieren.

Cratylus
quelle
5
Abstraktion scheint ein konzeptionelles Verständnis zu sein und nichts hat mit abstractSchlüsselwörtern zu tun, denke ich.
Billa
3

Kapselung ist das, wonach es sich anhört, eine Box um etwas zu legen, um seinen Inhalt zu schützen. Abstraktion extrahiert die funktionalen Eigenschaften von etwas, sodass Sie Operationen nur mit dem ausführen können, was Sie extrahiert haben, ohne das Innenleben zu kennen.

Wenn wir sagen, dass zwei Substanzen Flüssigkeiten sind, verwenden wir "Flüssigkeit" als Abstraktion über die Eigenschaften der Substanzen, die wir diskutieren möchten. Diese Abstraktion sagt uns, was wir mit den Substanzen tun können, wenn wir bereits Erfahrungen mit Flüssigkeiten gemacht haben.

Abstraktion hat auch nichts mit Erben zu tun. Sie können eine andere Abstraktion wie "Metalle" verwenden, die die Eigenschaften von Substanzen auf andere Weise extrahiert.

Abstraktionen vergessen Details. Wenn Sie also eine bestimmte Abstraktion verwenden, sollten Sie nicht nach Eigenschaften der zugrunde liegenden Substanz fragen, die von der Abstraktion nicht gewährt werden. Wenn Sie beispielsweise Milch und Wasser nehmen und miteinander mischen, fällt es Ihnen schwer, zu fragen, wie viel Milch Sie haben.

Ein Functor ist eine Abstraktion über etwas, das eine Vorstellung von Map hat. Das heißt, Sie können eine Funktion für den inneren Inhalt ausführen, die das innere Bit in etwas anderes umwandelt. Das äußere Etwas bleibt das Gleiche.

Dies ist nützlich, wenn Sie eine Funktion haben, die mit Listen funktioniert, und Sie feststellen, dass Sie nur von der Kartenoberfläche abhängig sind, können Sie sich stattdessen auf Functor verlassen und Ihre Funktion kann dann mit Streams, Versprechungen, Maybes, Tupeln und alles andere, was diese Abstraktion teilt.

Funktionale Sprachen wie Haskell haben einige wirklich große Abstraktionsfähigkeiten, die eine extreme Wiederverwendung von Code praktisch machen.

Jethro Larson
quelle
3

Abstraktion ist ein Mittel zum Ausblenden von Details , um eine Schnittstelle zu vereinfachen.

Am Beispiel eines Autos sind alle Steuerelemente in einem Auto Abstraktionen. Auf diese Weise können Sie ein Fahrzeug bedienen, ohne die zugrunde liegenden Details der Lenk-, Beschleunigungs- oder Verzögerungssysteme zu kennen.

Eine gute Abstraktion ist eine Abstraktion, die eine Schnittstelle über mehrere Instanzen eines ähnlichen Problems hinweg allgemein standardisiert. Eine große Abstraktion kann eine Branche verändern.

Das moderne Lenkrad, das Bremspedal und das Gaspedal sind Beispiele für großartige Abstraktionen. Die Autolenkung sah anfangs eher wie eine Fahrradlenkung aus. Und sowohl Bremsen als auch Drosseln wurden von Hand betätigt. Aber die Abstraktionen, die wir heute verwenden, waren so mächtig, dass sie die Branche erfassten.

- -

Die Kapselung ist ein Mittel zum Ausblenden von Details , um sie vor Manipulationen von außen zu schützen.

Die Verkapselung verhindert, dass der Fahrer die Art und Weise, wie das Auto fährt, manipuliert - von der Steifheit der Lenkung, Federung und Bremse bis zu den Eigenschaften von Gas und Getriebe. Die meisten Autos bieten keine Schnittstellen zum Ändern dieser Dinge. Diese Kapselung stellt sicher, dass das Fahrzeug wie vom Hersteller beabsichtigt funktioniert.

Einige Autos bieten eine kleine Anzahl von Fahrmodi - wie Luxus, Sport und Wirtschaftlichkeit -, mit denen der Fahrer mehrere dieser Attribute gleichzeitig ändern kann. Durch die Bereitstellung von Fahrmodi ermöglicht der Hersteller dem Fahrer eine gewisse Kontrolle über das Erlebnis und verhindert gleichzeitig, dass er eine Kombination von Attributen auswählt, die das Fahrzeug weniger angenehm oder unsicher machen würden. Auf diese Weise verbirgt der Hersteller die Details, um unsichere Manipulationen zu vermeiden. Dies ist die Kapselung.

aridlehoover
quelle
Ehrlich gesagt ist dies eine der besten Antworten, die ich gelesen habe ... Ich kann immer noch nicht verstehen, warum es 2 positive Stimmen gab. Ich habe die Antwort positiv bewertet ...
Chethan Venkataramaiah
2

Abstraktion ist wie mit einem Computer.

Sie haben absolut keine Ahnung, was damit los ist, außer was Sie mit der GUI (grafische Benutzeroberfläche) und externer Hardware (z. B. Bildschirm) sehen. All diese hübschen Farben und so. Sie erhalten nur die Details, die für Sie als generischer Verbraucher relevant sind.

Kapselung ist der eigentliche Vorgang des Versteckens irrelevanter Details .

Sie verwenden Ihren Computer, sehen jedoch nicht, wie seine CPU (Zentraleinheit) aussieht (es sei denn, Sie versuchen, in ihn einzudringen). Es ist hinter all dem Chrom und Kunststoff versteckt (oder eingekapselt).

Im Kontext von OOP-Sprachen (Object-Oriented Programming) haben Sie normalerweise folgende Einstellungen:

CLASS {
  METHOD { 
    *the actual code*
  }
}

Ein Beispiel für "Kapselung" wäre eine METHODE, die der normale Benutzer nicht sehen kann (privat). "Abstraktion" ist der reguläre Benutzer, der die METHODE verwendet, die er (öffentlich) verwenden kann, um die private zu verwenden.

Dan
quelle
1

Datenabstraktion: Der Zugriff auf Datenelemente und Elementfunktionen einer Klasse wird einfach als Datenabstraktion bezeichnet.

Kapselung: Das Binden von Variablen und Funktionen oder 1 kann sagen, dass Datenelemente oder Elementfunktionen in einer Einheit als Datenkapselung bezeichnet werden.

Anuja Dhakite
quelle
1

Die Kapselung kann als Geschenkpapier betrachtet werden, das zum Binden von Daten verwendet wird und als eine Einheit fungiert, die sie vor allen Arten von externem Schmutz schützt (ich meine externe Funktionen).

Abstraktion beinhaltet das Fehlen von Details und die Verwendung einer einfachen Schnittstelle zur Steuerung eines komplexen Systems.

Zum Beispiel können wir eine Glühbirne per Knopfdruck anzünden, ohne uns um die zugrunde liegende Elektrotechnik (Abstraktion) kümmern zu müssen.

Sie können die Glühbirne jedoch nicht auf andere Weise anzünden. (Verkapselung)

Jayraj Srikriti Naidu
quelle
0
public abstract class Draw {
    public abstract void drawShape(); // this is abstraction.  Implementation detail need not to be known.
    // so we are providing only necessary detail by giving drawShape(); No implementation. Subclass will give detail.


    private int type;    // this variable cannot be set outside of the class. Because it is private.
    // Binding private instance variable with public setter/getter method is encapsulation 

    public int getType() { 
        return type;
    }

    public void setType(int type) {  // this is encapsulation. Protecting any value to be set.
        if (type >= 0 && type <= 3) {
            this.type = type;
        } else {
            System.out.println("We have four types only. Enter value between 0 to 4");
            try {
                throw new MyInvalidValueSetException();
            } catch (MyInvalidValueSetException e) {
                e.printStackTrace();
            }

        }
    }
}

Abstractionbezieht sich auf Methoden, bei denen keine Implementierungsdetails bekannt sind, was eine Art Verstecken der Implementierung darstellt.
Encapsulationhängt mit der Bindung von Instanzvariablen mit method zusammen, einer Art versteckter Daten.

AmitG
quelle
Ist es möglich, den Wert von typeim Implementierer zu ändern , da die Implementiererklasse die Implementierung bereitstellt
Billa
@Billa Ich habe deine Frage im Kommentar nicht verstanden.
AmitG
Kann ich aus einer konkreten Klasse einen Wert für die typein der abstrakten Klasse definierte Variable festlegen oder ändern ? Warum kann sich die konkrete Klasse nicht ändern, da sie die eigentliche Implementierung liefert?
Billa
Die private Variable typeist in der konkreten Klasse nicht vererbbar, da sie privat ist. Sie können jedoch eine typeVariable festlegen , indem Sie die setType()Methode aus einer konkreten Klasse aufrufen . Aber wir können keinen Wert setzen, was wir wollen. Wenn wir der Öffentlichkeit Zugriff typegewährt hätten, hätten wir keinen eingeschränkten typeWert, der auf einen bestimmten Bereichswert festgelegt werden könnte. Diese Art von Ansatz / Design ist also Verkapselung.
AmitG
0

Datenabstraktion : DA filtert einfach das konkrete Element. Durch die Klasse können wir die reine Abstraktion erreichen, weil wir vor dem Erstellen der Klasse nur über betroffene Informationen über die Klasse nachdenken können.

Kapselung : Dies ist ein Mechanismus, mit dem wir unsere Daten von außen schützen.

Rajesh Maurya
quelle
0

Abstraktion bedeutet, dem Benutzer die erforderlichen Informationen anzuzeigen, wobei als Kapselung die unerwünschten Daten vor dem Benutzer (Produkt vor dem Benutzer) ausgeblendet werden.

Kapselung implementiert die Abstraktion.

Abstraktion ist der Prozess, bei dem Encapsulation sie tatsächlich implementiert. Zum Beispiel. Hinzufügen von Benutzerlogik -> Wir müssen den Benutzer validieren, eine DB-Verbindung herstellen und den Benutzer einfügen. Der Benutzer weiß also nicht, dass er zuerst die Validierungsfunktion aufrufen, eine DB-Verbindung herstellen und dann den Wert in die DB einfügen muss. Er ruft nur die AddUser-Funktion auf, die die intern alle Logik mit in aufruft. Dies ist nur Encapsulation (Gruppieren der Funktion und Ausblenden der Methoden).

Vijay
quelle
Hallo, willkommen bei Stack Overflow. Wenn Sie eine Frage beantworten, die bereits viele Antworten enthält, geben Sie bitte einen zusätzlichen Einblick, warum die von Ihnen bereitgestellte Antwort inhaltlich ist und nicht nur das wiedergibt, was bereits vom Originalplakat überprüft wurde. Diese Frage hat 14 Antworten , die alle den Wunsch zeigen, durch Zeitaufwand einen Beitrag zur Website und zum Verständnis des Originalplakats zu leisten. Ihr Beitrag zeigt nichts davon.
chb
0

Kapselung: Ich denke, das hat viel damit zu tun, wie man Dinge zu einer Einheit zusammenbinden kann, anstatt sich zu verstecken. Wenn Sie etwas verstecken möchten, können Sie.

Abstraktion: Abstraktion hat viel mit dem Verstecken von Dingen zu tun und es kann verschiedene Abstraktionsebenen geben. In der funktionalen Abstraktion könnte man beispielsweise sagen, dass es wichtig ist, Elemente zu einer Liste hinzufügen zu können, aber die Details, wie dies erreicht wird, sind nicht von Interesse und sollten ausgeblendet werden. Bei Verwendung der Datenabstraktion würden wir sagen, dass eine Liste ein Ort ist, an dem wir Informationen speichern können, aber wie die Liste tatsächlich implementiert wird (z. B. als Array oder als eine Reihe verknüpfter Speicherorte), ist unwichtig und sollte ausgeblendet werden.

Referenz

raj240
quelle