具有以下结构(在Android Java项目中):
public abstract class A {
...
}
public class B extends A {
...
}
public class C extends A {
...
}
在某些时候,需要存储父类类型的列表,因为我们正在使用多态。
但是,如果我们尝试存储父类型的对象,如下所示:
A aObject = xObject; //(xObject could be an object of type B or C)
Backendless.Persistence.save(aObject, new AsyncCallback<A>() { ...
我们将得到一个&#34;无法更新没有任何属性的对象:CREATOR&#34;错误,因为我们试图存储一个抽象类。
是否有可能实现这一目标?子类B和C之间的区别在于它们执行某些操作(如渲染图像和文本)的方式。
编辑1:具体案例
具体案例是一个用于创建Memes的Android应用程序(Meme是一个有趣的图像,里面有一些文字)。在这种情况下,Memes可以用经典的方式绘制,这是一种图像,顶部是文本,底部是另一个文本。 Memes也可以作为引用,这是一个右边有一个黑色方块的图像,其中包含一个句子和下面的作者。
为了模拟这个问题,我创建了一个抽象类Meme,它包含属性(name,topText,bottomText,image等等)和子类用于绘制图像的方法,以及两个子类ClassicMeme和以我们自己的方式绘制模因的QuoteMeme。
问题在于,当用户创建Meme时,他可以将Meme的类型切换为绘制,因此我需要一个多态引用来处理这种情况。当我继续存储Meme(基类)对象时,我意识到这是不可能的,因为Meme是一个抽象类,当然我不知道这个基类引用中包含什么类型的子对象。 (希望我已经解释清楚了。)
答案 0 :(得分:1)
您遇到此问题的原因是:
执行一些操作,例如以不同方式呈现某些图像和文本
此问题/要求与您的数据模型类无关,因此它不应位于同一个类中。数据模型类应该是只具有属性且实际上没有功能的普通类。
因此,您应该创建一些“演示者”类或类似的东西,以拥有与数据显示方式相关的逻辑。当您需要显示数据时,创建其中一个类的实例并将其传递给数据模型类的实例。然后它可以获取所需的数据并根据需要显示它。
通过这种方式,您的数据模型和持久层是干净有效的,您可以轻松添加所需的任何表示样式,而不会影响该数据模型。