Java使用超类实例数据启动子类实例

时间:2015-09-03 19:47:34

标签: java android

我有一个存储用户收藏夹的班级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的两个公共类MomentImageDataMomentVideoData

我的数据来自HTML请求,该请求直接填充FavoriteInfo中的字段并返回FavoriteInfo个实例的列表。这是我想要保持不变的数据源。除了子类中的DATA_TYPE_IMAGEDATA_TYPE_VIDEO之外,我没有任何其他字段。

我的问题是如何使用此列表构建MomentImageData列表和MomentVideoData列表?

这就是我想要实现的目标:

List<MomentData> mData;
List<MomentImageData> imgData; // from one source 
List<MomentVideoData> videoData; // from another

mdata.addAll(imgData);
mdata.addAll(videoData);

这可能看起来很奇怪,但它实际上是一个Android应用,我有一个自定义适配器,以MomentData mData作为数据源,然后根据类型(图像或视频)膨胀不同的视图)动态地。

1 个答案:

答案 0 :(得分:0)

从超类实例创建子类实例的最直接方法是将字段从超类实例复制到子类实例

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