在Java中结合两个类?

时间:2017-04-01 19:17:23

标签: java android

我不知道提出这个问题的正确方法是什么,但是我有两个类,我从API返回,它们都有name作为共同点但是还有另一个相互独立的字段。在我的User类可以获得name但是也可以获得自己的变量的地方“组合”它们的最佳方法是什么。

我的User课程怎么样?我正在寻找User班级让name参与进来,异形班有alienVariable而人类班有humanVariable

我的两个班级的例子

外来

@AutoValue
public abstract class Alien implements Parcelable {
    public static Alien create(String alienVariable) {
        return new AutoValue_Alien(alienVariable);
    }

    public static Alien create(String name, String alienVariable) {
        return new AutoValue_Alien(name, alienVariable);
    }

    public static TypeAdapter<Alien> typeAdapter(Gson gson) {
        return new AutoValue_Alien.GsonTypeAdapter(gson);
    }

    @SerializedName("name")
    public abstract String name();

    @Nullable
    @SerializedName("alien_variable")
    public abstract String alienVariable();
}

@AutoValue
public abstract class Human implements Parcelable {
    public static Human create(String humanVariable) {
        return new AutoValue_Human(humanVariable);
    }

    public static Human create(String name, String humanVariable) {
        return new AutoValue_Human(name, humanVariable);
    }

    public static TypeAdapter<Human> typeAdapter(Gson gson) {
        return new AutoValue_Human.GsonTypeAdapter(gson);
    }

    @SerializedName("name")
    public abstract String name();

    @Nullable
    @SerializedName("human_variable")
    public abstract String humanVariable();
}

用户?

3 个答案:

答案 0 :(得分:1)

使用带有name()方法的接口。

一般来说,如果你有一些共同的属性,最好有一个超类而不是接口,但如果满足超类槽,那么你唯一的选择是接口。

答案 1 :(得分:1)

您可以执行以下操作。顺便说一句,我还没有尝试编译它,它只是一个想法的支架

public interface Species implements Parcelable {
    @SerializedName("name")
    String name();
    @Nullable
    String typeVariable();
}

public class Alien implements Species {
    @Override
    public String name() {}

    @Override
    @SerializedName("alien_variable")
    public String alienVariable() {}

    // fill in rest of class
}

public class Human implements Species {
    @Override
    public String name(){}

    @Override
    @SerializedName("human_variable")
    public String humanVariable() {}

    // fill in rest of class
}

答案 2 :(得分:0)

我所寻找的是瓦希德所建议的。我不想要继承而是多态。 (应该指定)

刚刚制作了一个看起来像这样的接口类。

public interface Species {
    String name();
}

然后在每个类中覆盖它,例如the Human

@AutoValue
public abstract class Human implements Parcelable, Species {
    public static Human create(String humanVariable) {
        return new AutoValue_Human(humanVariable);
    }

    public static Human create(String name, String humanVariable) {
        return new AutoValue_Human(name, humanVariable);
    }

    public static TypeAdapter<Human> typeAdapter(Gson gson) {
        return new AutoValue_Human.GsonTypeAdapter(gson);
    }

    @SerializedName("name")
    public abstract String name();

    @Nullable
    @SerializedName("human_variable")
    public abstract String humanVariable();

    @Override
    public String name() {
       return name();
    }
}