私はこのような類似の質問がたくさんあることを理解していますが、私がうまくいく解決策を見つけることができないため、私は説明しようとします..Java - オブジェクトがclassAまたはclassBのインスタンスである場合、
私はクラスTextField
とTextArea
を持つlibgdxゲームフレームワークを使用しています。 TextArea
はTextField
の拡張であり、いくつかの追加メソッドがあり、TextField
メソッドのいくつかをオーバーライドしています。複数のテキスト行を持つ機能を追加します。
これらのクラスには追加の同じメソッドが含まれていますので、両方ともクラスTextFieldExt
とTextAreaExt
で拡張しました。これらの両方で、doMethod1()
とdoMethod2()
というメソッドを追加しました。
だから、私はそれがTextFieldExt
またはTextAreaExt
のいずれかに遭遇するとき、私はそれはいくつかのアクションを実行し、doMethod1()
とdoMethod2()
を実行したい、(TextField
のスーパークラスおよび他の多くのオブジェクトである)Actors
を反復処理しています。
今私が望むのは、このようなものです。
if(actor instanceof TextFieldExt || actor instanceof TextAreaExt){
(...) actor.doMethod1();
}
私はこれが不可能である知っている、とJavaの目には、これらのメソッドが存在する保証がないため、鋳造またはステートメントのいずれかの種類がそれを許可しません。
私は両方のクラスで必要なメソッドを持つインターフェイスを構築しようとしましたが、それは正しい方法で実行されているように感じますが、それでも動作させることはできません。したがって、例えば私は持っています。
public interface ExtendedTextElement {
public void doMethod1();
public void doMethod2();
}
次に、私の拡張クラスでは、
public class TextFieldExt extends TextField implements ExtendedTextElement
public class TextAreaExt extends TextArea implements ExtendedTextElement
私の条件文で私は試してみます。インスタンスがTextField
またはTextArea
の拡張であるという保証がないため、当然、動作しませんので、私は基本メソッドにアクセスすることはできません
if(actor instanceof ExtendedTextElement){ ...
。
だから私は立ち往生しています。別々の条件文とコードの重複を手作業で少しずつ手を加えることができますが、それはかなりのコードであり、むしろ適切な解決策があります。
「TextField」と「TextArea」のどちらの基本メソッドが必要ですか?そして、どんな目的のために?これらのメソッドのシグネチャを 'ExtendedTextElement'インタフェースに追加するだけです。いくつかの合理的な解決法があるかもしれないが、あなたがしようとしていることの[小さな自己完結型の例](http://stackoverflow.com/help/mcve)を提供できれば助けになるだろうあなたの特定の要件。 – dimo414
actorがTextFieldExtのインスタンスである場合、TextFieldExtにキャストしてメソッドを呼び出します。そのTextAreaExtのインスタンスがTextAreaExtにキャストされ、そのメソッドが呼び出されます。 –
まったく信じられない@ dimo414、そのような単純な解決策とそれは動作します。私はそれについても考えなかったとは信じられません。ありがとうございました! – hamham