[英]Automate Construction of a Subclass when passed an Instance of a Superclass
我通过传入超类的实例来创建子类的实例。 这是我的代码-可以正常工作-但感觉不正确。
我的问题是:Java是否没有使用Object Cast或类似方法对此提供本机支持?
或者,如果我真的想自动执行此操作,我是否被迫使用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;
}
}
如果我们向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);
}
您不需要传递人对象
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");
另一种方法是使用包装器或适配器模式:
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);
}
}
您可以在Person中使用一个静态方法,该方法接受两个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类内,而不是全部显示给子类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.