Ich habe gehört, dass es eine Möglichkeit gibt, einzelne Vererbung zu betrügen und Mehrfachvererbung in Java zu implementieren. Kann jemand das implementieren (ohne Verwendung der Schnittstelle)?
Nur aus Neugier; -)
Sicher kannst du es, aber es ist schwierig und du solltest wirklich überlegen, ob du so willst Die Idee ist die Verwendung von Scope-basierter Vererbung gekoppelt mit typbasierten. Typisch ist, dass interne Klassen interne Klassen Methoden und Felder der äußeren Klasse "erben". Es ist ein bisschen wie Mixins, bei denen die äußere Klasse in die innere Klasse eingemischt ist, aber nicht so sicher, da Sie sowohl den Zustand der äußeren Klasse ändern als auch deren Methoden verwenden können Gilad Bracha (einer der wichtigsten Java-Sprachdesigner) schrieb eine Zeitung , die das diskutierte. Angenommen, Sie möchten einige Methoden für die interne Verwendung zwischen nicht verwandten Klassen freigeben (z. B. für die Zeichenfolgenmanipulation), können Sie Unterklassen von ihnen als innere Klassen einer Klasse mit allen erforderlichen Methoden erstellen, die von den Unterklassen verwendet werden können Methoden sowohl von ihren Super-Klassen und von der äußeren Klasse.
Wie auch immer, es ist schwierig für komplexe Klassen, und Sie könnten den Großteil der Funktionalität mit statischen Importen (ab Java 5) erhalten. Gute Frage für Vorstellungsgespräche und Pub-Quiz, -;)
Die Verwendung von Komposition anstelle von Vererbung ist dafür typisch. Dies hilft auch sehr bei der Testbarkeit, also ist es eine gute Übung im Allgemeinen.
Wenn Sie möchten, dass sich Ihr Typ wie mehrere andere Typen verhält, können Sie von so vielen Interfaces erben, wie Sie möchten; Sie können jedoch offensichtlich keine Implementierungsdetails von diesen "ausleihen".
Ich glaube, dass der grundlegende Grund, warum Java keine Mehrfachvererbung unterstützt, derselbe wie C # ist; Alle Objekte werden letztendlich von Object abgeleitet und mehrere Pfade zur selben Basisklasse sind für den Compiler mehrdeutig. Mehrdeutig == Schlecht, der Compiler lässt das nicht zu.
Stattdessen können Sie die Mehrfachvererbung durch Delegierung simulieren. In diesem Artikel finden Sie ein Beispiel.
Sie können es ein wenig schummeln (und ich betone etwas), indem ich java.lang.reflect.Proxy-Instanzen verwende.
Dies erlaubt Ihnen wirklich nur, zusätzliche Schnittstellen hinzuzufügen und ihre Aufrufe zur Laufzeit an eine andere Instanz zu delegieren.
Als jemand, der neue Entwickler betreut und betreut, wäre ich entsetzt, wenn mir jemand Code zeigen würde, der das getan hat. Reflection ist eines dieser Tools, die man wirklich verstehen muss und die Java gut verstehen, bevor man hineinspringt. Ich persönlich habe das nur einmal gemacht und es war etwas Code zu machen, den ich nicht kontrollieren konnte anderer Code, den ich nicht kontrollieren konnte, hatte ich erwartet (es war ein schneller Hack, also musste ich nicht zu viel Code schreiben und schreiben).
Verwenden Sie interface
s. Sie können so viele implementieren, wie Sie möchten. Sie können normalerweise eine Variante des Composite-Patterns (GoF) verwenden, um den Implementierungscode wiederverwenden zu können, wenn dies wünschenswert ist. p>
Sie müssen vorsichtig sein, um die Schnittstellenvererbung (im Wesentlichen die Vererbung eines Vertrags zur Bereitstellung bestimmter Einrichtungen) von der Implementierungsvererbung (Vererbung von Implementierungsmechanismen) zu unterscheiden.
Java bietet Schnittstellenvererbung durch den implementiert Mechanismus und Sie können mehrere Schnittstellenvererbungen haben.
Implementierungsvererbung ist der Mechanismus erweitert und Sie haben nur eine einzige Version davon. Benötigen Sie wirklich mehrere Implementationsvererbungen? Ich wette, du tust es nicht, es ist randvoll mit unangenehmen Konsequenzen, außer du bist sowieso ein Eiffel-Programmierer.
Sie könnten es wahrscheinlich "simulieren", indem Sie den Satz von Superklassen explizit verwalten und mithilfe von Reflektion alle Superklassen für die Zielmethode durchsuchen. Ich würde das nicht in der Produktion machen wollen, aber es könnte ein interessantes Spielzeugprogramm sein. Sie könnten wahrscheinlich eine Menge seltsamer Dinge tun, indem Sie Reflektionen nutzen, spontan Klassen erstellen und den Compiler programmatisch aufrufen.
JAVA unterstützt keine Mehrfachvererbung.
Sie können es implementieren, um mehrere Schnittstellen zu implementieren, und einige sehen dies als eine Möglichkeit, das Problem zu umgehen. Persönlich habe ich noch mehrfache Erbschaft, so dass ich seine Attraktivität nicht wirklich verstehen kann.
Normalerweise, wenn jemand mehrfache Vererbung in c # oder JAVA vorschlägt, aufgrund der Tatsache, dass "sie" in c ++ könnten. Ich bin ein Fan von "nur weil du es nicht meinen kannst". Als c # & amp; JAVA unterstützt es nicht, warum versuchen Sie es zu zwingen, etwas zu tun, für das es nicht vorgesehen war. Das soll nicht heißen, dass es einzigartige Fälle gibt, in denen es eine gültige Technik für empoly ist, nur der Code kann normalerweise refaktorisiert werden, um ihn nicht zu brauchen.
Ich habe darüber ein wenig mehr nachgedacht und festgestellt, dass zwar dynamische Proxies funktionieren (so funktioniert RMI (used?)), wenn Sie diese Art von Funktionalität wirklich wollen, würden Sie besser aspektorientierte Programmierung ( AOP) mit etwas wie AspectJ (eclipse.org/aspectj).
Auf diese Weise können Sie mehrere verschiedene Aspekte in einer Klasse erhalten, die Ihnen Pseudomixin-Vererbung ohne die schrecklich fragilen Erbhierarchien bietet.
Wie alle anderen bereits festgestellt haben, weist das Bedürfnis nach Mehrfachvererbung darauf hin, dass Sie das Problem nicht aus der richtigen Perspektive betrachten. Erinnern Sie sich an das GoF-Prinzip "Komposition vor Vererbung bevorzugen"!
Wenn Sie innere Klassen verwenden, bevorzugt C ++ dies auch manchmal: Inner Class Idiom .
Ja, Sie können sagen, dass es ein Trick ist, und es ist sehr interessant, dass Sie nicht mehrere Klassen in einer einzelnen Klasse erben können, aber es ist möglich, mehrere Interfaces zu einer Klasse wie
zu implementieren %Vor%, aber denken Sie daran, dass Sie Methoden, die in Schnittstellen deklariert sind, außer Kraft setzen müssen.
Tags und Links java inheritance oop