将值从Superclass复制到Subclass

时间:2013-11-18 08:33:43

标签: java java-ee-6

我有超级下课。

SuperOne.java

public class SuperOne{

  private String id;
  private String name;

  //public setter and getter methods


}

SubOne.java

public class SubOne extends SuperOne{

 //To Do : SubOne has no extra fields.

}

我有以下方法:

public SubOne getData(String id){

      SuperOne data = someDao.getData(String id)

      // Now we have result in data . Now i need to convert data into SubOne and return.

  }

SuperOne.java 没有构造函数,由第三方提供,我无法修改。但我可以修改SubOne,因为它是我自己的。 请建议我将SuperOne转换为SubOne的最佳方法

3 个答案:

答案 0 :(得分:1)

您可以使用SubOne作为包装,而不是孩子

class SubOne {

    private SuperOne superOne;

    public SubOne(SuperOne) {
        this.superOne = superOne;
    }

    public String getId() {
        return this.superOne.getId();
    }

    public String getName() {
        return this.superOne.getName();
    }

    public String setId(String id) {
        return this.superOne.setId(id);
    }

    public String setName(String name) {
        return this.superOne.setName(name);
    }

    ///////////////

    public SubOne getData(String id){
        SuperOne data = someDao.getData(String id)
        return new SubOne(data);  
    }

附录

如果你坚持继承SuperOne,你可以这样做。

class SubOne extends SuperOne {

    public SubOne(SuperOne superOne) {
        super.setId(superOne.getId());
        super.setName(superOne.getName());
    }

答案 1 :(得分:0)

您有几个选择:

  1. 修改数据层,以便从数据库中读取SubOne个对象,而不是SuperOne

  2. 创建一个SubOne构造函数,该构造函数接受SuperOne参数并从中复制所有数据。这可能会破坏一些内部不变量,具体取决于ORM(例如,它可能会导致Hibernate出现问题)。

  3. 提供SubOneSuperOne字段,并将该字段分配给您从数据库中读取的对象。覆盖SuperOne的所有公共方法并委托给存储的SuperOne。如果您public final的{​​{1}}方法无法委托,则可能无法进行此操作。

  4. 不要创建子类。创建一个带有SuperOne字段的新类,并将其分配给从数据库中读取的对象。为新类添加任何额外的高级逻辑。如果您打算将对象传递给期望SuperOne的方法,这可能没用。

  5. 选项4引入了最少量的并发症。问问自己是否真的需要SuperOne成为SubOne的子类,或者如果你只是用你自己的对象包装它并将它抽象出来。

答案 2 :(得分:-1)

不,您无法更改父类的Private数据..

是否违反了OOPS概念?