繁体   English   中英

传递超类的实例时自动构建子类

[英]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");

看看Java中的OO概念

另一种方法是使用包装器或适配器模式:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM