Java使用超类实例数据初始化子类实例
我有一个类Java使用超类实例数据初始化子类实例,java,android,Java,Android,我有一个类FavoriteInfo,它存储用户的收藏夹。它有一组私有字段和公共获取: public class FavoriteInfo implements Serializable { public static String KEY ="FavoriteInfo"; private String favtype; private String rdbkey; private String VideoURL; private St
FavoriteInfo
,它存储用户的收藏夹。它有一组私有字段和公共获取:
public class FavoriteInfo implements Serializable {
public static String KEY ="FavoriteInfo";
private String favtype;
private String rdbkey;
private String VideoURL;
private String ImageURL;
private Float Temperature;
/* more such fields */
public String getFavtype() {
return favtype;
}
public void setFavtype(String favtype) {
this.favtype = favtype;
}
public String getRdbkey() {
return rdbkey;
}
public void setRdbkey(String rdbkey) {
this.rdbkey = rdbkey;
}
public String getImageURL() {
return ImageURL;
}
public void setImageURL(String imageURL) {
this.ImageURL = imageURL;
}
那么我有:
public abstract class MomentData extends FavoriteInfo {
public static final int DATA_TYPE_IMAGE = 0;
public static final int DATA_TYPE_VIDEO = 1;
public abstract int getDataType();
public abstract View getChildView(Context context,View convertView, ViewGroup parent);
}
以及两个扩展MomentData的公共类MomentImageData
和MomentVideoData
我的数据来自一个HTML请求,该请求直接填充FavoriteInfo
中的字段,并返回FavoriteInfo
实例的列表。这是我想保持不变并利用的数据源。除了子类中的DATA\u TYPE\u IMAGE
和DATA\u TYPE\u VIDEO
之外,我没有任何其他字段
我的问题是如何使用此列表来构建MomentImageData
列表和MomentVideoData
列表
这就是我想要实现的目标:
List<MomentData> mData;
List<MomentImageData> imgData; // from one source
List<MomentVideoData> videoData; // from another
mdata.addAll(imgData);
mdata.addAll(videoData);
列出mData;
列出imgData;//从一个来源
列出视频数据;//从另一个
mdata.addAll(imgData);
mdata.addAll(视频数据);
这可能看起来很奇怪,但它实际上是一个Android应用程序,我有一个自定义适配器,它将
MomentData mData
作为数据源,然后根据类型(图像或视频)动态放大不同的视图 从超类实例创建子类实例最直接的方法是将字段从超类实例复制到子类实例中
public MomentImageData(FavoriteInfo info) {
setRdbkey(info.getRdbkey());
// ... and all the others
}
另一种方法是使用反射或深度复制库来避免编写所有这些setter
Java不会这样做,因为MomentImageData是FavoriteInfo,但不是
维切维萨
另一种方法是使用组合而不是继承:
public class MomentImageData {
FavoriteInfo info;
public MomentImageData(FavoriteInfo info) {
this.info = info;
}
}
因此,您可以轻松创建一个实例,如
List<FavoriteInfo> list = new ArrayList();
// fill the list
MomentImageData mid = new MomentImageData(list.get(1));
List List=new ArrayList();
//填写清单
MomentImageData mid=新的MomentImageData(list.get(1));
不太清楚您想要完成什么。不管怎样,当你有一个额外的类(类型)MomentImageData
时,为什么你需要DATA\u TYPE\u IMAGE
?@petermm更新了问题。我假设在FavoriteInfo
中,你收到的是VideoURL
或ImageURL
。这是真的吗?更改您的类型声明:List实际上我有一个列表。我想分别填充MomentImageData和MomentVideoData,并将它们添加到我的列表中。这就是为什么我有这个继承结构。你可以看到我更新的描述。非常感谢。即使FavoriteInfo类中的字段都是私有的,您仍然可以在子类中设置它们并在子类中获取它们吗?谢谢。因为我认为私有字段不会被子类继承。你的问题和上面的评论都不清楚。您是否收到列表
或列表
?那么列表中元素的实际类型是什么?您可以有一个列表
,列表中的每个对象都是MomentImageData
或MomentVideoData
的实例,或者只是FavoriteInfo
的普通实例。所有这些都会对如何解决你的问题产生影响。@AbbéRésina我收到一份清单。实际类型是类型FavoriteInfo。