Ich bin daran interessiert, objektorientierte Programmierung auf akademischere und abstraktere Weise zu verstehen als ich es derzeit tue und möchte wissen, ob es objektorientierte Konzepte gibt, die Java und C ++ nicht implementieren.
Ich weiß, dass keine der Sprachen "reine" OO ist, aber ich bin daran interessiert, was (wenn überhaupt) ihnen fehlt, nicht was sie extra haben.
Von meinem Kopf weg würde ich sagen:
In den Worten von Alan Kay , dem Erfinder des Begriffs "Objektorientierung" :
OOP bedeutet für mich nur Messaging, lokal Aufbewahrung und Schutz und Verstecken des Staatsprozesses und extrem Spätbindung aller Dinge. Es kann sein in Smalltalk und in LISP gemacht. Dort sind möglicherweise andere Systeme, in denen das ist möglich, aber mir ist das nicht bekannt sie.
C ++ erfüllt offensichtlich das Kriterium "extrem spät bindend" nicht, und sowohl Java als auch C ++ erfüllen das Kriterium "Messaging" aufgrund ihrer starren Klassen- / Methodenstruktur nicht. So wie ich es verstehe, betrachtet das Konzept von Kay Methoden mit einem bestimmten Namen und einer bestimmten Signatur als eine bequeme Möglichkeit, Message-Handler zu implementieren, aber keineswegs die einzige.
Weitere interessante Aussagen aus derselben Email:
Ich mochte den Weg Simula I oder nicht Simula 67 hat Erbe [...] Also ich beschlossen, die Erbschaft als a wegzulassen eingebaute Funktion, bis ich es verstanden habe besser.
und
Der Begriff "Polymorphismus" wurde eingeführt viel später (ich denke von Peter Wegner) und es ist nicht ganz gültig, da es wirklich aus der Nomenklatur von Funktionen kommt, und ich wollte ein bisschen mehr als Funktionen.
Es gibt eine andere Art, über objektorientierte Programmierung nachzudenken, die sich von dem klassenbasierten System in Java und C ++ unterscheidet. Die prototypbasierte Programmierung wird von JavaScript verwendet. Wenn Sie sich die gesamte Palette der OOP-Stile anschauen möchten, sollten Sie sich einen Blick darauf werfen: Ссылка
Java verfügt nicht über mehrfache Vererbung, aber einige mögen sagen, dass dies eher ein Segen ist, da es erfordert, dass Benutzer an die richtige Architektur denken. Sie können Interfaces und abstrakte Klassen verwenden, um dies zu umgehen.
Die Mehrfachvererbung wurde für die folgenden Probleme kritisiert, die sie in bestimmten Sprachen verursacht, insbesondere in C ++:
Das wichtigste Merkmal der objektorientierten Programmierung ist die Kapselung. Das Ausblenden von Implementierungsdetails ist offensichtlich entscheidend für das Schreiben von wartbarem Code.
Da Sie in C ++ unkontrollierte Zeiger haben, ist es für ein schlecht geschriebenes Objekt möglich, buchstäblich alles mit einem anderen zu tun. Dies bedeutet, dass die Kapselung unterbrochen ist und Fehler nur schwer zu finden sind.
Java hat dieses Problem nicht, aber es fehlt grundlegende Konsistenz. Das ist nicht unbedingt ein objektorientiertes theoretisches Feature, aber in der Lage zu sein zu deklarieren, dass eine Methode schreibgeschützt ist oder dass ein Objekt schreibgeschützt ist, ist ein fantastischer Zuverlässigkeitsverbesserer in C ++, der nicht in Java ist.
Last, javas Template-Mechanismus ist eine blasse Imitation von C ++. Nicht in der Lage zu sein, Klassen zu parametrisieren ist ein großer Verlust für Java.
Da Java Zeiger auf Methoden nicht unterstützt und die Reflektion zu langsam ist, erzwingt es die Verwendung vieler kleiner Objekte, wenn ein Funktionszeiger dies tun würde. Manche mögen das für eine gute Sache halten.
Java und C ++ erlauben prozedurale Programmierung. Das kann für einige Leute als ein Minus angesehen werden.
Die meisten interpretierten Sprachen erfüllen die spätbindenden Anforderungen. In Perl können Sie Code aus einer Datenbanktabelle extrahieren, ihn in den Interpreter werfen und dann Objekte der neuen Klasse instanziieren, die Sie gerade in das Programm eingeführt haben.
Erfüllt Python Kay's Definition von OOP vollständig? Ich habe nicht genug Arbeit in Python getan, um sicher zu sein. Ich vermute nicht, da Python 'native Typen' hat, die keine Objekte sind.