我的模型的简单继承问题

时间:2016-01-18 21:24:37

标签: java android inheritance gson

在我的应用中,我以此格式获取JSON数据

{
    "data": {
        "key1": "value1",
        "key2": "value2",
    },
    "success": true
}

我使用gson将其解析为对象,这是我的模型:

public class ApiResponse {
    @SerializedName("success")
    @Expose
    private Boolean success;
    @SerializedName("errormsg")
    @Expose
    private String errormsg;

    /**
     * @return The success
     */
    public Boolean getSuccess() {
        return success;
    }

    /**
     * @param success The success
     */
    public void setSuccess(Boolean success) {
        this.success = success;
    }

    /**
     * @return The errormsg
     */
    public String getErrormsg() {
        return errormsg;
    }

    /**
     * @param errormsg The errormsg
     */
    public void setErrormsg(String errormsg) {
        this.errormsg = errormsg;
    }

}

我将始终获得success密钥,如果是真的话,那么data将会在那里,如果不是errormsg而是。

现在data中的JSON密钥是我的实际模型。

由于所有模型都具有上述属性,我正在寻找一种方法extend该类。

例如:

public class MyModel extends ApiResponse{}

所以我可以这样做:

myModel.getData().getKey1();

我试图覆盖getData(),但模型会有所不同,所以我能够找到解决方案。

我可以使用嵌套类但我必须重复这些属性并将我的真实模型添加为嵌套类。

如何让我的模型继承相同的公共属性。

data也可以是对象或对象列表。

1 个答案:

答案 0 :(得分:2)

您可以使用泛型来解决此问题。 更具体一点 - 您应该定义基类抽象,如此

public abstract class ApiResponse<T> {

    @SerializedName("data")
    private T mData;

    public T getData() {
        return mData;
    }

    //common code - success, etc.
}

然后您可以定义具体的请求类,如下所示:

public class MyResponse extends ApiResponse<MyData> {

}

getData() 

方法,在MyResponse对象上调用将返回解析的MyData。当然,您应该在MyData类中标记所有可解析的字段。

请记住,继承的模型类将期望从基类中序列化/反序列化的所有字段,因此您应该保持清洁并尽可能地限制继承深度。