tl; dr: Sie können Vererbung ohne OO haben, Sie können Verkapselung ohne OO haben, Sie können Polymorphismus ohne OO haben, Sie können sogar alle drei auf einmal ohne OO haben. Auf der Rückseite können Sie OO ohne Vererbung haben. Außerdem gibt es verschiedene Arten der Einkapselung (ADT-orientiert und OO). IOW ist nicht jede Einkapselung OO.
Lange Version:
Der Begriff "Objektorientierte Programmierung" wurde von Alan Kay erfunden, damit er entscheiden kann, was es bedeutet. Und er definiert es so :
OOP bedeutet für mich nur Nachrichtenübermittlung, lokale Aufbewahrung und Schutz sowie das Verstecken von staatlichen Prozessen und extrem spätes Binden aller Dinge.
In Bezug auf die Implementierung ist Messaging ein spät gebundener Prozeduraufruf. Wenn Prozeduraufrufe spät gebunden sind, können Sie zur Entwurfszeit nicht wissen, was Sie aufrufen werden, sodass Sie keine Annahmen über die konkrete Darstellung des Status treffen können. Es geht also wirklich um Messaging. Late-Binding ist eine Implementierung von Messaging, und die Kapselung ist eine Folge davon.
Später stellte er klar, dass " die große Idee" Messaging "ist, und bedauert, sie" objektorientiert "statt" nachrichtenorientiert "genannt zu haben, weil der Begriff" objektorientiert "den Fokus auf das Unwichtige (Objekte) legt ) und lenkt von dem ab, was wirklich wichtig ist (Messaging):
Nur eine sanfte Erinnerung daran, dass ich bei der letzten OOPSLA einige Anstrengungen unternommen habe, um alle daran zu erinnern, dass Smalltalk nicht nur NICHT seine Syntax oder die Klassenbibliothek ist, sondern nicht einmal Klassen. Es tut mir leid, dass ich den Begriff "Objekte" für dieses Thema vor langer Zeit geprägt habe, weil es viele Leute dazu bringt, sich auf die geringere Idee zu konzentrieren.
Die große Idee ist "Messaging" - darum geht es bei Smalltalk / Squeak (und es ist etwas, das in unserer Xerox-PARC-Phase nie ganz abgeschlossen wurde). Die Japaner haben ein kleines Wort - ma - für "das, was dazwischen liegt" - vielleicht ist das nächste englische Äquivalent "interstitial". Der Schlüssel zur Entwicklung großartiger und erweiterbarer Systeme liegt vielmehr in der Gestaltung der Kommunikation der Module als in der Festlegung der internen Eigenschaften und Verhaltensweisen. Denken Sie an das Internet - um zu leben, muss es (a) viele verschiedene Arten von Ideen und Realisierungen zulassen, die über einen bestimmten Standard hinausgehen, und (b) ein unterschiedliches Maß an sicherer Interoperabilität zwischen diesen Ideen ermöglichen.
(Natürlich konzentrieren sich die meisten Menschen heute nicht mehr auf Objekte, sondern auf Klassen, was noch falscher ist.)
Messaging ist für OO sowohl als Metapher als auch als Mechanismus von grundlegender Bedeutung .
Wenn Sie jemandem eine Nachricht senden, wissen Sie nicht, was er damit macht. Das einzige, was Sie beobachten können, ist ihre Reaktion. Sie wissen nicht, ob sie die Nachricht selbst verarbeitet haben (dh ob das Objekt eine Methode hat), ob sie die Nachricht an eine andere Person weitergeleitet haben (Delegation / Proxying) oder ob sie sie überhaupt verstanden haben. Darum geht es bei der Verkapselung, darum geht es bei OO. Sie können einen Proxy nicht einmal von der Realität unterscheiden, solange er so reagiert, wie Sie es erwarten.
Ein "moderner" Begriff für "Messaging" ist "dynamischer Methodenversand" oder "virtueller Methodenaufruf", der jedoch die Metapher verliert und sich auf den Mechanismus konzentriert.
Ähnliche Punkte finden sich auch in On Understanding Data Abstraction, überarbeitet von William R. Cook, und in seinem Vorschlag für vereinfachte, moderne Definitionen von "Objekt" und "objektorientiert" .
Der dynamische Versand von Vorgängen ist das wesentliche Merkmal von Objekten. Dies bedeutet, dass die aufzurufende Operation eine dynamische Eigenschaft des Objekts selbst ist. Operationen können nicht statisch identifiziert werden, und es gibt im Allgemeinen keine Möglichkeit, genau zu bestimmen, welche Operation als Antwort auf eine bestimmte Anforderung ausgeführt wird, es sei denn, sie wird ausgeführt. Dies ist genau das gleiche wie bei erstklassigen Funktionen, die immer dynamisch abgesetzt werden.
In Smalltalk-72 gab es nicht einmal Gegenstände! Es gab nur Nachrichtenströme, die analysiert, umgeschrieben und umgeleitet wurden. Zuerst kamen Methoden (Standardmethoden zum Parsen und Umleiten der Nachrichtenströme), später kamen Objekte (Gruppierungen von Methoden, die einen privaten Status gemeinsam haben). Die Vererbung erfolgte viel später, und Klassen wurden nur eingeführt, um die Vererbung zu unterstützen. Wäre Kays Forschungsgruppe bereits über Prototypen informiert gewesen, hätte sie wahrscheinlich niemals Klassen eingeführt.
Jeder Programmierer sollte " Über das Verständnis der Datenabstraktion" lesen . Es wird detailliert erläutert, worin genau der Unterschied zwischen Objekten und abstrakten Datentypen besteht. Er gibt Beispiele mit Java, und das ist für diese Frage äußerst relevant, da er sowohl in den ADT-Beispielen als auch in den Object-Beispielen Vererbung, Kapselung und Polymorphismus verwendet, aber nur eines der Beispiele objektorientiert ist! Mit anderen Worten: Sie können Vererbung, Einkapselung und Polymorphismus haben, Sie können sogar alle drei auf einmal haben und haben immer noch keine OO.
Auf der anderen Seite können Sie OO ohne Vererbung haben. Wie ich oben angedeutet habe: Die Originalversionen von Smalltalk (die von Alan Kay, dem Erfinder des Begriffs "objektorientierte Programmierung", entworfene Sprache) hatten keine Vererbung.
Last but not least diskutiert der Vertrag von Orlando die Delegation als Alternative zur Vererbung und wie unterschiedliche Formen der Delegation und Vererbung zu unterschiedlichen Gestaltungspunkten im Gestaltungsraum objektorientierter Sprachen führen. (Beachten Sie, dass die Leute auch in Sprachen, die Vererbung unterstützen, wie Java, tatsächlich lernen, dies zu vermeiden, was wiederum darauf hinweist, dass dies für OO nicht erforderlich ist.)