0

この問題を定義する方法が完全にわからないため、この問題を探すのに苦労しています。我慢してください。

私が質問を表現できる最善の方法は次のとおりです。Java では、コードで事前定義されているのではなく、ポリモーフィズムを介して実行時にクラスが定義されている変数を作成するにはどうすればよいですか?

おそらく、これを例で最もよく定義できます。サブクラス Thug、Psionic、Shooter、および Gadgeteer を持つ抽象的なスーパークラス Superhero があるとします。行エントリが個々のスーパーヒーローである CSV データ ファイルから読み取りたい。各スーパーヒーローのファイルリストの変数の中には、それらが属するクラスがあります。各スーパーヒーローをファイルにリストされているクラスに割り当てるにはどうすればよいですか? これまでに行ったことには、次のようなものがあります。

次のように、サブクラス型の配列を作成します。

numberOfClasses = 4; // constant
Superhero[] heroType = new Superhero[numberOfClasses];
heroType[0] = new Thug();
heroType[1] = new Psionic();
heroType[2] = new Shooter();
heroType[3] = new Gadgeteer();

次に、ファイルの各行を処理する for ループがあります。各行で、ヒーローの名前を変数 tempClassName に読み取り、これを行うネストされたループを開始します。

for (int index=0; index<numberOfClasses; index++)
{
    Class heroClass = heroType[index].getClass();

    if (tempClassName.equals(heroClass.getName()))
    {
        Superhero newHero = new heroClass; // problem line
    }
}

最後の問題行は、サブクラスが変数 heroClass にあるものである新しいスーパーヒーロー オブジェクトを作成することになっています。しかし、おそらくこれが機能しないことがわかります。これを「new heroClass」として定義すると、heroClass() メソッドが必要なため、構文エラーが発生します。しかし、heroClass はメソッドではないため、「new heroClass()」も問題です。基本的に、getClass() の結果を使用して、新しく作成した変数の (サブ) クラス型にする方法を教えてください。各サブクラスのコンストラクターで何かをする必要がありますか?

4

3 に答える 3

1

クラス名のリストがあるとします className[]

 for(int i =0;i<className.length;i++)
 {
  SuperHero superHero = (SuperHero)Class.forName("PACKAGE_NAME" + className[i]).newInstance();

  //use this superhero where you want. you can also save this superhero in ArrayList of type SuperHero.
  }
于 2012-04-05T15:13:11.387 に答える
1
    Superhero[] heroType = new Superhero[]{
            new Thug(),
            new Psionic(),
            new Shooter(),
            new Gadgeteer()
    };

    for (int index = 0; index < heroType.length; index++) {
        Class heroClass = heroType[index].getClass();

        if (tempClassName.equals(heroClass.getName())) {
            Superhero newHero = (Superhero) heroClass.newInstance();
        }
    }
于 2012-04-05T14:54:32.080 に答える
0

このタイプのリフレクションが良いアイデアであると確信していると仮定すると、次のことができます。

heroClass.newInstance();
于 2012-04-05T14:53:01.810 に答える