1

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

我的问题是:Java 没有使用对象强制转换或类似方法对此提供本机支持吗?

或者如果我真的想自动化这个,我是否被迫使用反射/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

4 回答 4

1

如果我们向 Person 添加一个新属性会怎样——我们可能会忘记在此处添加它...

  • 或者应该注意这些方法的接口。
  • 或者在超类中编写方法

因此,从下面的示例中,我们将接口传递Person给`Solder:

个人信息

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);      

}
于 2013-10-26T13:56:24.177 回答
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);
}

}

于 2013-10-26T14:03:34.297 回答
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");

看看java中OO的概念

于 2013-10-26T13:58:37.727 回答
0

您可以在 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 类中,而不是全部显示给子类。

于 2013-10-26T14:11:04.297 回答