在 java 中使用超类对象创建未知子类的新实例
Make a new instance of an unknown subclass using superclass object in java
这里我有一个抽象的class人和多个子classes:
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);
}
人变得和列表中的人一样,我如何得到它作为一个人的克隆。克隆和新实例不起作用。
我可能可以使用复制方法来完成它(需要我重写大量代码)但是有没有(可能更有效的)方法可以不用它?
使用具有 Cloneable 接口的工具使您的 class 可克隆。并在对象 user .clone() 方法中克隆 person class object
我不是 clone()
的粉丝 - 另请参阅 Clone() vs Copy constructor- which is recommended in java
所以,改用复制构造函数或复制方法,接受一个人,然后传递相关信息
您可以创建一个方法来创建 Person 的新对象(根据子 class)和另一个方法来复制新对象中的状态。请参阅下面的方法了解相同的基本实现。
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()
即可获取副本对象。
这里我有一个抽象的class人和多个子classes:
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);
}
人变得和列表中的人一样,我如何得到它作为一个人的克隆。克隆和新实例不起作用。
我可能可以使用复制方法来完成它(需要我重写大量代码)但是有没有(可能更有效的)方法可以不用它?
使用具有 Cloneable 接口的工具使您的 class 可克隆。并在对象 user .clone() 方法中克隆 person class object
我不是 clone()
的粉丝 - 另请参阅 Clone() vs Copy constructor- which is recommended in java
所以,改用复制构造函数或复制方法,接受一个人,然后传递相关信息
您可以创建一个方法来创建 Person 的新对象(根据子 class)和另一个方法来复制新对象中的状态。请参阅下面的方法了解相同的基本实现。
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()
即可获取副本对象。