2

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

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

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

编辑1:具体案例

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

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

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

4

1 回答 1

1

您遇到此问题的原因是课程:

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

此问题/要求与您的数据模型类无关,因此不应在同一个类中。数据模型类应该是只有属性和有效零功能的普通类。

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

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

于 2016-05-26T09:34:53.043 回答