0

変数を使用してさまざまなクラスをインスタンス化しようとしています。例えば:

Object blah;
class1 ex1;
class2 ex2;

public void test(int i){
    if(i == 1){
        blah = new class1();
    } else {
        blah = new class2();
    }
} 

Javaでこれを行うにはどうすればよいですか?

編集 1: 申し訳ありませんが、もう少し具体的に説明させてください。

A、B、Cの3つのクラスがあるとしましょう。

A は私のメインの場所であり、B を使用します。B は C を使用します。

問題はこれです:

public class B1{
    C instanceC;

    public B1(){
    instanceC = new C();
    //uses a method of instanceC.
    }
}
public class B2{
    C instanceC;

    public C(){
    instanceC = new C();
    //uses a method of instanceC.
    }
}

そしてAで:

public class A implements MouseListener{
    Object blah;
    B1 instanceB1;
    B2 instanceB2;

    public void test(int i){
        if(i == 1){
            blah = new B1();
        } else {
            blah = new B2();
        }
    }
//I left the other mouseListener methods blank
    public void mouseReleased(int i){
        blah.instanceC.someMethod();
    }

    public static void main(String[] args) {
        A instanceA = new A();
        A.test(1);
    }
}

編集 2: instanceC.someMethod() または instanceC.someVariable を使用しようとすると、null ポインター例外が発生します。

これが十分に明確だったことを願っています。わかりにくい場合はお知らせください。さらに単純化できるかどうかを確認します。すでに助けてくれた人々に感謝します!

4

2 に答える 2

5

blahが として宣言されている場合、それは機能します (クラスではなくインスタンスでObject使用していることを除いて) — ただし、 on でないメソッドまたはプロパティを使用するのは厄介です。newObject

これを行う通常の方法は、interfacesを使用することです。インターフェイスは と の共通の特性を定義しclass1、インターフェイスを使用してclass2宣言blahします。次に、具象クラスを簡単に作成して、共通の特性にアクセスできます。

例えば:

interface Foo {
    void someCommonMethod();
}

class Class1 implements Foo {
    void someCommonMethod() {
        // implementation
    }
}

class Class2 implements Foo {
    void someCommonMethod() {
        // implementation
    }
}

public void test(int i){
    if(i == 1){
        blah = new Class1();
    } else {
        blah = new Class2();
    }

    // ...use `someCommonMethod` on `blah`...
}
于 2013-06-09T23:24:31.230 に答える
0

あなたのコードは決してコンパイルされません。

  • B1 と B2 とは何ですか? C()それらの内容は、署名はコンストラクターのようなものですが、名前はそうではありません。コンストラクターでない場合、 がandinstanceC内で初期化されることをどのように保証しますか?B1B2
  • とはA instanceA = new instanceA();? でしょうA instanceA = new A();か?そして、呼び出しinstanceA.test()ますか?

私の仮定が正しければ、instanceC2 つの異なるオブジェクトにアクセスしようとしています。問題は、「常に instanceC という名前ですか?」ということです。その場合は、リフレクションを使用し、名前でフィールドを探します。

クラスのすべてのフィールドを反復処理して何かを行いたい場合は、再びリフレクションを使用してフィールドを反復処理し、それらのタイプをチェックして、適切なフィールド タイプについてメソッドを呼び出します。

于 2013-06-10T03:04:58.683 に答える