2016-04-11 6 views
0

Ich habe vielleicht die Terminologie falsch, also entschuldige ich mich, ich bin ziemlich der Java-Anfänger.Java - erhalten erweiterte Klasse von Objekt mit Elternklasse

Ich verwende das LibGDX-Framework, um ein mobiles Spiel zu entwickeln und zu versuchen, seine Stage- und Actor-Klassen zu nutzen.

Ich habe meine eigene Klasse StageExtension erstellt, die eine Erweiterung der Stage-Klasse ist, da ich einige meiner eigenen Methoden hinzugefügt habe. Also sagen wir, ich habe;

StageExtension stageExt = new StageExtension(): 
Actor actor = new Actor(); 
stageExt.addActor(actor); 

Das funktioniert einwandfrei. Das Problem ist, wenn ich die Bühne vom Actor abrufen möchte, um eine meiner eigenen StageExtension-Methoden aufzurufen. Der Actor-Verweis bezieht sich auf die Bühne, aber nur auf die "Bühne", z. die Actor-Klasse hat den Getter;

public Stage getStage() { 
    return stage; 
} 

Also, klar verstehe ich nicht sehr gut Java. Wenn ich den Actor zur Bühne hinzufüge, ruft er setStage() im Actor auf, sodass die StageExtension als gerade eine Bühne im Actor festgelegt wird. Wenn dies passiert, ignoriert Java einfach meine erweiterte Klasse?

Wie kann ich meine StageExtension-Instanz vom Actor aufrufen, ohne diese Hauptklassen zu kopieren und zu ändern?

Hoffe, das macht Sinn, danke.

+1

tun eine Besetzung auf getStage, StageExtension stageExt = (StageExtension) actor.getStage(). – dumitru

+0

Danke für die schnelle Antwort, die ich hinzufügen wollte Ich habe das schon probiert und bekam eine Nullzeiger-Ausnahme, die ich für die richtige Antwort hielt, sollte das dann tatsächlich funktionieren? Ich werde es noch einmal versuchen, vielleicht habe ich etwas falsch gemacht. – hamham

+0

Um zu vermeiden, dass der Null-Zeiger zuerst auf eine 'Stufe' verweist, prüfen Sie, ob das Objekt richtig ist. 'Stage stage = actor.getStage();' gefolgt von 'if (Stage-Instanz von StageExtension) {StageExtension stageExt = (StageExtension) stage; ...} ' – flakes

Antwort

1

Was Sie dort sehen, ist ein Beispiel für Casting. Was du gemacht hast, ist eine Unterklasse mit deiner neuen Klasse StageExtension. In diesem Fall sind alle StageExtensions Stages, aber nicht alle Stages sind StageExtensions. Wenn dies der Fall ist, kann Java eine StageExtension auf eine Bühne werfen. Also in Ihrem Fall, wenn Sie tun

StageExtension somesStage = new StageExtension(); 
... 
actor.setStage(somesStage) 

Dann java wird versuchen, die StageExtension someStage auf eine Bühne für Sie zu werfen. In der Actor-Klasse wird es als Bühne behandelt, weil es das ist, was es in jeder Hinsicht denkt. Dies funktioniert, da StageExtension eine Unterklasse von Stage ist. Gehen Sie auf die andere Art und Weise Sie das Objekt explizit

if(actor.getStage() instanceof StageExtension){ 
    StageExtension myStage = (StageExtension) actor.getStage() 
} 

Jetzt Java tun Cast sollte es am besten ist, diese Aufgabe zu der Unterklasse zu werfen

+0

Danke für die Erklärung. Ich dachte, die Umwandlung von getStage() in eine StageExtension würde tatsächlich eine neue Instanz erstellen und ich hätte keinen Zugriff auf Variablen, die in der vorhandenen StageExtension-Instanz festgelegt sind. Es stellt sich heraus, dass ich falsch liege und das funktioniert perfekt. Sie haben recht, wenn Sie überprüfen, ob es sich bei der Bühne tatsächlich um eine Instanz von StageExtension handelt, da dies möglicherweise in anderen Fällen nicht möglich ist. Würde es irgendeinen Speicher- oder Geschwindigkeitsvorteil geben, oder würde ich meine eigene Version der Actor-Klasse erstellen, die StageExtension standardmäßig enthält? – hamham

+0

Es gibt keinen Grund, Actor von einer Instanz von StageExtension abzuleiten und wäre in manchen Fällen schädlich, da Sie dann sicherstellen müssten, dass Actor's Stage und StageExtension für die anderen Dinge synchron bleiben, die vermutlich die Actor's Stage für Dinge verwenden . –

+0

Ich habe darüber nachgedacht, ob ich die StageExtension ausschließlich in meiner App verwenden werde, aber es funktioniert trotzdem so gut, danke. Nur eine kleine Anmerkung, Sie haben eine abschließende Klammer in Ihrer Antwort bei StageExtension {weggelassen. – hamham

Verwandte Themen