2011-06-21 8 views
0

参照変数を変更することはできません。Java - 参照変数を変更する

私は2つの異なるクラスを持っています。それらをAとBとしましょう。それらは同じクラスを指定したメソッドと同じメソッドを持っています。

どのクラスをインスタンス化するかを賢明に変更する方法が必要です。

1つの方法では、どのオプションが選択されているかをチェックして、対応するクラスをインスタンス化することができます。私はこれがかさばると醜いかもしれないことを恐れているが、私はこの方法を避けようとしている。もっと賢いものがなければならない。

現在、私はAとBと同じクラスを拡張する新しいクラス(例えばC)を作るの

を考えている私は、その後、(クラスAとBはまたところでそうであるように)メソッドをオーバーライドします設定に応じてメソッドを実行します(つまり、どのクラスAまたはBが選択されているか)。メソッドはクラスAまたはBと同じように返されます。

希望私は完全な不器用さを話していません。

答えて

6

これを行う1つの方法は、Factory Patternを使用することです。

ウィキペディアからの引用部分:他の生成に関するパターンと同様に

、それ が作成されるオブジェクトの 正確なクラスを指定せずに オブジェクト(製品)を作成する問題と 扱っています。

など。

public abstract class Base { 

    public abstract void doSomething(); 
} 

public class A extends Base { 

    public void doSomething() { 
     System.out.println("A"); 
    } 
} 

public class B extends Base { 

    public void doSomething() { 
     System.out.println("B"); 
    } 
} 

public class C extends Base { 

    public void doSomething() { 
     System.out.println("C"); 
    } 
} 

public interface BaseFactory { 

    public Base createBase(int condition); 

} 

public class DefaultBaseFactory implements BaseFactory { 

    public Base createBase(int condition) { 

     switch (condition) { 
      case 0 : return new A(); 
       break; 

      case 1: return new B(); 
       break; 

      case 3: return new C(); 
       break; 

      default: return null; 
       break; 
     } 
    } 
} 
+0

を使用すると、共通の基底クラス(またはインタフェース)からABを拡張する必要がありますようにしかし、それは聞こえますオプションの量を減らすために 'createBase()'のパラメータを使用します。 – Thomas

+0

@Thomas、enumは問題ありません。私はこの例を単純化しました。 –

+0

私はこれを読んでみるつもりです。私が扱っている問題は多少あるようです。ありがとう。 –

1

あなたの説明は混乱します。

abstract class Base { 
    public abstract void someMethod(); 
} 

class A extends Base { 
    public void someMethod() { System.out.println("A"); } 
} 

class B extends Base { 
    public void someMethod() { System.out.println("B"); } 
} 

あなたはこのような何かできることを意味します:私はとして列挙型を使用したい

Base base; 
if (someCondition) { 
    base = new A(); 
} 
else { 
    base = new B(); 
} 

base.someMethod(); 
関連する問題