2016-04-11 20 views
0

私は誤った用語を持っている可能性がありますので、私はかなりJavaの新人です。Java - 親クラスを含むオブジェクトから拡張クラスを取得

私はLibGDXフレームワークを使用して、モバイルゲームを開発し、StageクラスとActorクラスを使用しようとしています。

Stageクラスの拡張である独自のクラスStageExtensionを作成しました。これは、自分のメソッドをいくつか追加したためです。だから私は持っていると言うことができます。

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

これは完全に問題なく動作します。問題は、俳優からステージを取得して、自分のStageExtensionメソッドの1つを呼び出す場合です。 Actorはステージへの参照を保持しますが、ステージのみを保持します。 Actorクラスにはゲッターがあります。

public Stage getStage() { 
    return stage; 
} 

私はJavaをよく理解していません。ステージにアクタを追加すると、アクタのsetStage()が呼び出されるため、StageExtensionはアクタのステージとして正常に設定されます。これが起こると、Javaは拡張クラスを無視しますか?

これらのコアクラスをコピーして変更することなく、ActorからStageExtensionインスタンスを呼び出すにはどうすればよいですか?

これは理にかなっています。ありがとう。

+1

にこのオブジェクトをキャストするのが最善です尽くすオブジェクトをキャストする必要があり、他の道を行くために、 ()。 – dumitru

+0

速い応答をありがとう、私は実際にこれを試して、nullポインタの例外が、私は正しい応答だと思ったが、これは実際に動作する必要が追加します。私はもう一度やり直すだろう、多分私は間違ったことをした – hamham

+0

nullポインタが 'Stage'を参照するのを避けるために、オブジェクトが正しいことを確認してください。 'stage stage = actor.getStage();'の後に 'if(stage instanceof StageExtension){StageExtension stageExt =(StageExtension)stage; ...} ' – flakes

答えて

1

あなたが見ているものはCastingの例です。あなたがしたことは、新しいクラスStageExtensionでサブクラス化されたStageです。したがって、すべてのStageExtensionsはステージですが、すべてのステージがStageExtensionsであるわけではありません。その場合、JavaはStageExtensionをステージにキャストできます。だからあなたの場合には、あなたが

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

を行う場合、JavaはあなたのためにステージにStageExtension someStageをキャストしようとします。 Actorクラスでは、ステージとして扱われます。なぜなら、それはすべての目的や目的に当てはまると思うからです。これは、StageExtensionがStageのサブクラスであるために機能します。あなたが明示的に

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

今はJavaが、それはあなたのgetStage、StageExtension stageExt =(StageExtension)actor.getStageにキャストを行うサブクラス

+0

ありがとうございました。私はgetStage()をStageExtensionにキャストすると実際に新しいインスタンスが作成され、既存のStageExtensionインスタンスに設定された変数にアクセスすることはできないと考えました。それは私が間違っていることが判明し、これは完全に動作します。ステージが実際にStageExtensionのインスタンスであることを確認するのは正しいですが、他のインスタンスにはない可能性があります。このようなメモリやスピードの利点があるのでしょうか、デフォルトでStageExtensionを含むActorクラスの独自のバージョンを作るのでしょうか? – hamham

+0

ActorがStageExtensionのインスタンスを持つようにサブクラス化する必要はなく、場合によってはActorのステージとStageExtensionが同期していることを保証する必要があるため、有害な場合があります。 。 –

+0

私は厳密に私のアプリでStageExtensionだけを使用すると思っていましたが、とにかくこのようにうまく動作しますので、ありがとうございます。ちょっとしたことですが、あなたはStageExtension {で答えを囲む括弧を外しました。 – hamham

関連する問題