2016-04-18 20 views
2

Gibt es in Java eine dynamische Vererbung?Dynamische Vererbung in Java

Nur zur Verdeutlichung, durch dynamische Vererbung meine ich: kann ich angeben, aus welcher Klasse ich bestimmte Klasse zur Laufzeit erben? (A erbt von {X | X ∈ {P, T, Q}})

Ich versuche nur zu verstehen, was meine Optionen sind, wenn ich zum Beispiel die Klasse Animal implementieren muss, die die folgenden untergeordneten Klassen haben wird : FlyingAnimal, WalkingAnimal, Swimming Animal, etc.

Gleichzeitig muss ich Animal in Menschen und NonHumans unterteilen, die leicht unterschiedliche Verhaltensweisen haben. Was ich tun möchte, ist, Menschen und Nicht-Menschen aus Tier abzuleiten, und dann Tier aus Walkable usw. abzuleiten. - Ich möchte entscheiden, welches es zur Laufzeit sein würde (vorausgesetzt, ein Tier kann entweder laufen oder fliegen).

+5

Kurze Antwort: nein. Lange Antwort: Nein. Sie können dies zur Laufzeit nicht dynamisch durchführen. –

+0

@LouisWasserman ha ha, good one :-) –

+0

Sie sollten alle Klassen implementieren, die Sie benötigen. Und wähle zur Laufzeit einen aus. – saka1029

Antwort

2

aus welcher Klasse ich erben bestimmte Klasse zur Laufzeit

Nr Java ist eine kompilierte Sprache mit der Kompilierung Typprüfung Zeit. Es ist jedoch möglich eine Bytecode-Manipulationsbibliothek wie BCEL zu verwenden, um Bytecodes zur Laufzeit zu erstellen; pro der BCEL Homepage ein interessante Anwendung ist die Schaffung von Klassen von Grund auf neu zu Laufzeit

+0

Danke @Elliot! Ich werde es mir ansehen, obwohl ich nicht glaube, dass mein Java-Wissen ausreicht, um in Byte-Manipulation (zumindest, noch) zu kommen. Aber gibt es eine Möglichkeit, die Klasse X von einer Klasse (A) zu erben und dann so etwas wie die Umwandlung des Ergebnisses in die Instanz einer Kindklasse (B) zu tun? –

3

Der richtige Weg, oder solche Situationen zu lösen in der Regel ist die (De-) Zusammensetzung und Delegation (das sind die Schlüsselwörter suchen nach).

Zum Beispiel könnte Ihre Klasse ein Objekt dieser Klassen enthalten, und verwenden Sie es einfach anstelle von erben.

heißt

interface Engine {} 
class Diesel implements Engine {} 
class Electric implements Engine {} 
class Car /* NOT extends Diesel/Electric */ { 
    Enigne engine; /* delegate or composition pattern */ 
}