我通过传入超类的实例来创建子类的实例。这是我的代码 - 有效 - 但感觉不对。
我的问题是:Java是否有使用Object强制或类似的原生支持?
或者,如果我真的想自动化这个,我是否被迫使用reflection / BeanUtils?
以下示例已经过简化,以突出显示问题。我的真实世界代码有很多字段。
谢谢,亚当。
import java.util.Date;
public class Person
{
private String name;
private Date dateOfBirth;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getDateOfBirth()
{
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth)
{
this.dateOfBirth = dateOfBirth;
}
}
public class Soldier extends Person
{
private String rank;
public Soldier(final Person p)
{
/*
* Isn't there a better way of doing this? What if we add a new
* attribute to Person - we could forget to add it here...
*/
setName(p.getName());
setDateOfBirth(p.getDateOfBirth());
}
public String getRank()
{
return rank;
}
public void setRank(String rank)
{
this.rank = rank;
}
}
答案 0 :(得分:1)
如果我们向Person添加一个新属性怎么办 - 我们可能忘记在这里添加它...
因此,从后面的例子我们将Person
的接口传递给`Solder:
<强> PersonItf 强>
public interface PersonItf {
String getName();
String getDateOfBirth();
}
<强>焊料强>
public class Soldier extends Person {
private String rank;
public Soldier(final PersonItf p)
{
// now we call all inteface methods
setName(p.getName());
setDateOfBirth(p.getDateOfBirth());
}
public String getRank()
{
return rank;
}
public void setRank(String rank)
{
this.rank = rank;
}
}
<强>人强>
public abstract class Person implements PersonItf
{
private String name;
private String dateOfBirth;
@Override
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
@Override
public String getDateOfBirth(){
return dateOfBirth;
}
public void setDateOfBirth(String dateOfBirth){
this.dateOfBirth = dateOfBirth;
}
}
主要强>
public static void main(String[] args) {
PersonItf person = new Person();
Soldier solder = new Soldier(person);
}
答案 1 :(得分:0)
您不需要传递人物对象
public class Soldier extends Person{
private String rank;
public String getRank()
{
return rank;
}
public void setRank(String rank)
{
this.rank = rank;
}
}
现在你可以制作士兵物品了:
Soldier soldier = new Soldier();
soldier.setRank("sergant");
soldier.setName("John");
答案 2 :(得分:0)
另一种方法是使用包装器或适配器模式:
public class Soldier extends Person{
private String rank;
private Person person;
public Soldier(final Person p)
{
this.person = p;
}
public String getRank()
{
return rank;
}
public void setRank(String rank)
{
this.rank = rank;
}
public String getName()
{
return person.getName();
}
public void setName(String name)
{
person.setName(name);
}
public Date getDateOfBirth()
{
return person.getDateOfBirth();
}
public void setDateOfBirth(Date dateOfBirth)
{
person.setDateOfBirth(dateOfBirth);
}
}
答案 3 :(得分:0)
你可以在Person中有一个静态方法,它接受两个人的实例,并设置另一个的一个值的所有字段值。
public class Person
{
public static setFieldValues(Person targetPerson, Person sourcePerson)
{
// set field values here
}
}
然后用
调用它public class Soldier
{
public Solder(Person p)
{
setFieldValues(this, p);
}
}
至少这样,字段值将在Person类中,而不是全部显示给子类。