通过多态在运行时定义变量的类

时间:2012-04-05 14:49:43

标签: java polymorphism

很难找到这个问题因为我不完全确定如何定义它。请耐心等待。

我能说的最好的问题是:在Java中,如何创建通过多态在运行时定义类的变量,而不是在代码中预定义?

也许我可以通过例子来最好地定义这个:假设我有一个抽象的超类超级英雄,子类是Thug,Psionic,Shooter和Gadgeteer。我想从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
    }
}

最后一个问题行应该创建一个新的Superhero对象,其子类是变量heroClass中的任何内容。但你可能会发现这不起作用。将其定义为“new heroClass”会产生语法错误,因为它需要一个方法heroClass()。但是“new heroClass()”也是一个问题,因为heroClass不是一个方法。基本上,我如何使用getClass()的结果作为我新创建的变量的(子)类类型?我是否需要对每个子类中的构造函数执行某些操作?

3 个答案:

答案 0 :(得分: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();
        }
    }

答案 1 :(得分: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.
  }

答案 2 :(得分:0)

假设你确定这种反射是个好主意,你可以做

heroClass.newInstance();