在 java 中使用超类对象创建未知子类的新实例



这里我有一个抽象类Person和多个子类:

public abstract class Person {
    public String name;
    public Person(String name) {
        this.name = name;
    }
}
public class ComputerScientist extends Person {
    public String job;
    public ComputerScientist(String name, String job) {
        super(name);
        this.job = job;
    }
}
public class SoftwareEngineer extends Person {
    public String job;
    public SoftwareEngineer(String name, String job) {
        super(name);
        this.job = null;
    }
}

这是我运行的:

public static void main(String[] args) {
    List<Person> people = new ArrayList<Person>();
    person.add(new ComputerScientist("ben", "job"));
    person.add(new SoftwareEngineer("larry", "job"));
    Random r = new Random();
    Person person = people.get(r.nextInt(people.size() - 1);
}
人员

变得与列表中的人员相同,如何将其作为人员克隆。克隆和新实例不起作用。

可能可以使用复制方法(要求我重写大量代码(来做到这一点,但是是否有任何(也许更有效(的方法可以做到这一点?

您可以创建一个方法来创建新的 Person 对象(根据子类(,并创建另一个方法来复制新对象中的状态。有关相同的基本实现,请参阅下面的方法。

public abstract class Person{
  ...//your states and methods
  protected void copy(Person copiedPerson){
        copiedPerson.name = this.name;
  }
  public abstract Person getCopyPerson();
}
public class SoftwareEngineer extends Person{
     ....//your states and methods
    @override
     protected void copy( Person copiedPerson ){
          super(copiedPerson);
          copiedPerson.job = this.job;
     }
    @override
    public Person getCopyPerson(){
       Person copyPerson = new SoftwareEngineer();
       copy(copyPerson);
       return copyPerson;
    }
}

现在,每当您获取 Person 的对象时,只需在其上调用 getCopyPerson() 即可获取复制对象。

我不喜欢clone() - 另请参阅克隆(( vs 复制构造函数 - 这在 java 中推荐

因此,改用复制构造函数或复制方法,接受一个人,然后传输相关信息。

使用具有可克隆接口的实现使您的类可克隆。 和 at 对象用户 .clone(( 方法来克隆人类对象

最新更新