传递超类实例时自动构造子类

时间:2013-10-26 13:52:34

标签: java oop theory copy-constructor

我通过传入超类的实例来创建子类的实例。这是我的代码 - 有效 - 但感觉不对。

我的问题是: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;
    }
}

4 个答案:

答案 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");

Have a look at the concepts of OO in java

答案 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类中,而不是全部显示给子类。