具有以下结构(在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>() { ...


因为我们正在尝试存储抽象类,所以我们将收到“没有任何属性的更新对象:创建者”错误。

是否有可能实现这一目标?子类B和C之间的区别在于它们执行某些操作(如渲染某些图像和文本)的方式。

编辑1:具体情况

具体情况是一个用于创建Memes的Android应用(Meme是一个有趣的图片,其中包含一些文本)。在这种情况下,模因可以以经典方式绘制,即图像的顶部是文本,底部是另一个文本。模因也可以被绘制为Quote,这是一幅图像,其右侧有一个黑色正方形,其中包含一个句子和下面的作者。

为了对此问题进行建模,我创建了一个抽象类Meme,其中包含属性(名称,topText,bottomText,图像等)以及子类应使用其绘制图像的方法,以及两个子类ClassicMeme和QuoteMeme,它们可以绘制图像模因以自己的方式。

问题是,当用户创建Meme时,他可以切换Meme的类型以绘制,因此我需要多态引用来处理这种情况。当我继续存储Meme(基类)对象时,我意识到这是不可能的,因为Meme是抽象类,当然,我不知道此基类引用中包含哪种子对象。 (希望我已经清楚地解释了)。

最佳答案

您有此问题的原因是这些类:


  执行一些操作,例如以不同的方式渲染某些图像和文本


该问题/要求与您的数据模型类无关,因此不应属于同一类。数据模型类应为仅具有属性且功能为零的普通类。

因此,您应该创建一些“ presenter”类或类似的类,以拥有与数据显示方式有关的逻辑。当需要显示数据时,请创建这些类之一的实例,然后将其传递给数据模型类的实例。然后,它可以获取所需的数据并根据需要显示它。

这样,您的数据模型和持久层是干净有效的,并且您可以轻松添加所需的任何表示样式,而不会影响该数据模型。

10-08 03:01