2011-01-09 11 views
0

スーパークラスAがあり、多くのサブクラスB、C、Dがあります。人々はより多くのサブクラスを書くことができます。それぞれのクラスはdostuff()メソッドを持っていますが、それぞれ異なる方法があります。オブジェクトはJavaでオブジェクトのクラスを構成します

私は、Aに属するオブジェクトまたはそのサブクラスのいずれかを構築するオブジェクトが必要です。

たとえば、サブクラスの名前またはそのクラスのオブジェクトを渡すことができ、クラスの別のオブジェクトを作成します。もちろん

私は

A construct(A var){ 
    stuff = var.dostuff(); 
    domorestuff(stuff) 
    return new A(stuff); 
} 

B construct(B var){ 
    stuff = var.dostuff(); 
    domorestuff(stuff) 
    return new B(stuff); 
} 

C construct(C var){ 
    stuff = var.dostuff(); 
    domorestuff(stuff) 
    return new C(stuff); 
} 

を書くことができますが、これは効率的ではありません。私は新しいサブクラスを作るたびに、いくつかの新しい行を書く必要があります。

私はジェネリックスを使うことはできないようです。 Aのサブクラスに含まれていないオブジェクトにはdostuff()を使用できないためです。

この場合、どうすればよいですか?

答えて

1

リフレクションを使用できます。

public static <T extends A> T construct(Class<T> tClass) { 
    T t = tClass.newInstance(); 
    t.doStuff(); 
    moreStuff(); 
    return t; 
} 

例外をキャストしてキャッチする必要があるかもしれませんが、それが基本的な考えです。

+0

これは素晴らしいです。 tのコンストラクタを使用したい場合はどうすればよいですか? –

+0

デフォルトコンストラクタを使用します。別のコンストラクタを使用する場合は、getConstructor()を使用する必要があります。 –

1

工場パターンを実装する必要があります。実装にはClass.forName(className)が使用されます。

public A create(String className) throws Exception { 
    return Class.forName(className).newInstance(); 
} 
関連する問題