gpt4 book ai didi

java - 抽象类为 parcelable

转载 作者:IT老高 更新时间:2023-10-28 23:34:36 25 4
gpt4 key购买 nike

我的应用中基本上有以下结构:

uml of my app

在没有抽象类ProjectItem的情况下实现这样的结构会很简单,但在这种情况下,我不知道如何实现。

抽象类 ProjectItem 需要一个 CREATOR 因为它应该是可打包的。 (喜欢in.readTypedList(mProjectItems, ProjectItem.CREATOR);在构造函数Project(Parcel in))中

但实际上,出于逻辑原因,CREATOR只能在其派生类中实现。

那么,如何实现这个结构以保持类 Project 可打包??

编辑

这是 Project 的构造函数之一的样子:

private Project(Parcel in) {
in.readTypedList(mProjectItems, ProjectItem.CREATOR);
}

但正如我已经说过的,ProjectItem 不应该实现 CREATOR

最佳答案

我的解决方案类似于 evertvandenbruel 的解决方案。但是我使用 int 识别具体类,以便我可以使用 switch block 。我在静态 getConcreteClass(Parcel) 方法中也有那个 switch block 。

AbstractClass.java

public abstract class AbstractClass implements Parcelable {

public static final int CLASS_TYPE_ONE = 1;
public static final int CLASS_TYPE_TWO = 2;

public static final Creator<AbstractClass> CREATOR = new Creator<AbstractClass>() {
@Override
public AbstractClass createFromParcel(Parcel source) {

return AbstractClass.getConcreteClass(source);
}

@Override
public AbstractClass[] newArray(int size) {
return new AbstractClass[size];
}
};

protected String mAbstractClassString;

public AbstractClass(String abstractClassString) {
mAbstractClassString = abstractClassString;
}

public AbstractClass(Parcel source) {
mAbstractClassString = source.readString();
}

public static AbstractClass getConcreteClass(Parcel source) {

switch (source.readInt()) {
case CLASS_TYPE_ONE:
return new ConcreteClassOne(source);
case CLASS_TYPE_TWO:
return new ConcreteClassTwo(source);
default:
return null;
}
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mAbstractClassString);
}

@Override
public String toString() {
return "Parent String: " + mAbstractClassString + '\n';
}
}

ConcreteClassOne.java

public class ConcreteClassOne extends AbstractClass {

private String mString;

public ConcreteClassOne(String abstractClassMemberString, String string) {
super(abstractClassMemberString);

mString = string;
}

public ConcreteClassOne(Parcel source) {
super(source);
mString = source.readString();
}

@Override
public void writeToParcel(Parcel dest, int flags) {

dest.writeInt(CLASS_TYPE_ONE);
super.writeToParcel(dest, flags);
dest.writeString(mString);
}

@Override
public String toString() {
return super.toString().concat("Child String: " + mString);
}
}

ConcreteClassTwo.java

public class ConcreteClassTwo extends AbstractClass {

private String mString;
private int mInt;

public ConcreteClassTwo(String abstractClassString, String string, int anInt) {
super(abstractClassString);
mString = string;
mInt = anInt;
}

public ConcreteClassTwo(Parcel source) {
super(source);
mString = source.readString();
mInt = source.readInt();
}

@Override
public void writeToParcel(Parcel dest, int flags) {

dest.writeInt(CLASS_TYPE_TWO);
super.writeToParcel(dest, flags);
dest.writeString(mString);
dest.writeInt(mInt);
}

@Override
public String toString() {

String string = super.toString();
for (int i = 0; i < mInt; i++) {
string = string.concat("Child String: " + mString + '\n');
}
return string;
}
}

关于java - 抽象类为 parcelable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22576709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com