我有超级下课。
public class SuperOne{
private String id;
private String name;
//public setter and getter methods
}
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的最佳方法。
答案 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)
您有几个选择:
修改数据层,以便从数据库中读取SubOne
个对象,而不是SuperOne
。
创建一个SubOne
构造函数,该构造函数接受SuperOne
参数并从中复制所有数据。这可能会破坏一些内部不变量,具体取决于ORM(例如,它可能会导致Hibernate出现问题)。
提供SubOne
个SuperOne
字段,并将该字段分配给您从数据库中读取的对象。覆盖SuperOne
的所有公共方法并委托给存储的SuperOne
。如果您public final
的{{1}}方法无法委托,则可能无法进行此操作。
不要创建子类。创建一个带有SuperOne
字段的新类,并将其分配给从数据库中读取的对象。为新类添加任何额外的高级逻辑。如果您打算将对象传递给期望SuperOne
的方法,这可能没用。
选项4引入了最少量的并发症。问问自己是否真的需要SuperOne
成为SubOne
的子类,或者如果你只是用你自己的对象包装它并将它抽象出来。
答案 2 :(得分:-1)
不,您无法更改父类的Private
数据..
是否违反了OOPS概念?