Frage

Ich habe gehört, dass es einen Weg gibt, einfache Vererbung und implementieren Mehrfachvererbung in Java zu betrügen. Wer weiß, wie dies zu implementieren (mit Verwendung von Interface)?

Nur aus Neugier; -)

War es hilfreich?

Lösung

Natürlich können Sie, aber es ist schwierig, und Sie sollten wirklich überlegen, ob das ist der Weg Sie gehen wollen.
Die Idee ist, bereichsbasierte Vererbung mit einem Typ-Basis gekoppelt zu verwenden. Welches ist die Typ-Talk zu sagen, dass für interne Zwecke, innere Klassen Methoden und Felder der äußeren Klasse „erben“. Es ist ein bisschen wie Mixins, wobei die äußere Klasse an der inneren Klasse Mixed-in ist, aber nicht so sicher, wie Sie den Zustand der äußeren Klasse ändern kann, sowie ihre Methoden.
Gilad Bracha (einer der wichtigsten Java-Sprache-Designer) hat ein Papier dass diskutieren. Also: Angenommen, Sie einige Methoden für den internen Gebrauch zwischen einigen nicht verwandten Klassen teilen möchten (zB für String-Manipulation), können Sie Unterklassen von ihnen als innere Klassen einer Klasse erstellen, die alle benötigten Methoden hat, und die Unterklassen könnten verwenden Methoden sowohl von ihren Superklassen und von der äußeren Klasse.

Wie auch immer, ist es schwierig für komplexe Klassen, und man konnte die meisten Funktionen mit statischen Importen (von Java 5 auf) erhalten. Große Frage für Vorstellungsgespräche und Pub Quiz, obwohl; -)

Andere Tipps

Single Mehrfachvererbung nicht von Java unterstützt wird, statt es hat Schnittstellen den gleichen Zweck zu dienen. Falls Sie unnachgiebig auf Mehrfachvererbung sollte es in C ++ erfolgen.

Mit der Komposition statt Vererbung neigt der Weg, um dies zu sein. Dies tatsächlich hilft auch viel mit Testbarkeit, so ist es gute Praxis im Allgemeinen.

Wenn Sie nur wollen, um Ihre Art zu wie einige andere Arten „verhalten“, können Sie so viele Schnittstellen erben, wie Sie möchten, obwohl; Sie können „borgen“ Details der Implementierung von dieser aber nicht, natürlich.

Ich glaube, dass der wesentliche Grund, dass Java keine Mehrfachvererbung unterstützt die gleiche wie C # ist; werden alle Objekte letztendlich von Objekt abgeleitet, und es ist mit mehreren Pfaden zu derselben Basisklasse für den Compiler mehrdeutig ist. Zweideutig == Bad, so dass die Compiler es nicht gestattet.

Sie können stattdessen mehrere Vererbung durch Delegation simulieren. Siehe dieser Artikel für ein Beispiel.

Sie können es ein wenig betrug (und ich betone ein wenig) von java.lang.reflect.Proxy Instanzen verwenden.

Das ist wirklich nur ermöglicht es Ihnen, zusätzliche Schnittstellen hinzuzufügen und ihre Anrufe an eine andere Instanz zur Laufzeit übertragen.

Als jemand, Mentoren und Tutoren neue Entwickler ich entsetzt wären, wenn mir jemand Code zeigt, dass dies tut. Reflexion ist eines jener Werkzeuge, die Sie wirklich brauchen ein gutes Verständnis von Java zu verstehen und haben vor dem Sprung. Ich habe persönlich immer nur dieses eine Mal getan, und es war etwas Code mache ich nicht implementieren hatte die Kontrolle über einige Schnittstellen einige andere Code hatte ich keine Kontrolle über erwartete (es war eine schnelle Hack, damit ich nicht zu viel Kleber Code schreiben und warten musste).

Mit interfaces. Sie können so viele implementieren, wie Sie möchten. Sie können in der Regel eine Variante auf der Composite-Pattern (GoF) verwenden der Lage sein, die Umsetzung Code wiederverwenden wenn das erwünscht ist.

Sie müssen vorsichtig sein, Schnittstellenvererbung zu unterscheiden (im Wesentlichen Vererbung eines Vertrages bestimmte Einrichtungen zur Verfügung zu stellen) von Implementierungsvererbung (Vererbung von Umsetzungsmechanismen).

Java bietet Vererbungsschnittstelle durch die Geräte Mechanismus und Sie können mehrere Interface-Vererbung haben.

Implementierungsvererbung ist der erweitert Mechanismus und Sie haben nur eine einzige Version davon. Haben Sie wirklich müssen Vererbung mehrere Implementierung? Ich wette, Sie nicht, es ist voll von unangenehmen Folgen Unterlegkeil ist, es sei denn, Sie sowieso ein Eiffel-Programmierer sind.

Sie könnten wahrscheinlich „simulieren“, indem die Menge der übergeordneten Klassen explizit die Verwaltung und die Reflexion alle Superklassen für die Zielmethode zu suchen. Ich möchte nicht, diese in der Produktion zu tun, aber es könnte ein interessantes Spielzeug Programm. Sie könnten wahrscheinlich eine Menge seltsame Dinge tun, die durch Reflexion nutzt, Erstellen von Klassen im Fluge, und den Aufruf des Compilers programmatisch.

JAVA nicht mehr inheritence unterstützen.

können Sie es über mehrere Schnittstellen und einige sehen dies als eine Möglichkeit, um das Problem zu implementieren. Persönlich habe ich noch mehrere inheritence zu verwenden, so kann ich nicht wirklich verstehen, seinen Reiz.

Normalerweise, wenn jemand schlägt vor, mehrere inheritence innerhalb C # oder Java seine aufgrund der Tatsache, dass ‚sie konnten‘ in C ++. Ich bin ein Fan von ‚nur, weil Sie doens't kann bedeuten, Sie sollten‘. Wie c # & JAVA nicht unterstützt wird, warum versuchen und es zu zwingen, etwas zu tun, es nicht zu tun, wurde entwickelt. Dies ist nicht zu sagen, dass es eindeutige Fälle, in denen es eine gültige Technik ist, empoly nur der Code in der Regel Refactoring werden kann, um es nicht benötigen.

Ich habe darüber nachgedacht, ein wenig mehr und erkennen, dass während dynamischer Proxys funktioniert (es ist wie RMI (verwendet?) Zu arbeiten), wenn Sie wirklich diese Art von Funktionalität wünschen würden Sie besser dran Blick auf aspektorientierte Programmierung ( AOP) mit so etwas wie AspectJ (eclipse.org/aspectj).

Auf diese Weise können verschiedene Aspekte in eine Klasse zu bekommen, Sie Pseudo mixin Erbe gibt, ohne die hideously fragile Erbe heirarchies.

Wie alle anderen darauf hingewiesen hat, wollen / brauchen Mehrfachvererbung im Allgemeinen bedeutet, dass Sie das Problem nicht aus der richtigen Perspektive nähern. Denken Sie daran, das GoF Prinzip der „bevorzugt Komposition der Vererbung“ für einen Start!

Es war ein Versuch, Mixins in Java zu bringen. Überprüfen Sie diesen Link aus: http://www.disi.unige.it/person/ LagorioG / jam /

Innere Klassen verwendet wird, ist es das, was C ++ manchmal auch bevorzugt: Inner Klasse Idiom .

Ja, man kann sagen, dass es ein Trick ist, und es ist sehr interessant, Sie nicht mehr Klassen zu einer einzigen Klasse erben kann, aber es ist möglich, mehrere Schnittstellen zu einer Klasse wie

implementieren
public class parents implements first, second{

}

aber denken Sie daran, müssen Sie Methoden in Interfaces deklariert außer Kraft setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top