我有一个抽象类,它定义了要在图形中绘制的scoreitem的结构。评分项目有多种变体。它们都有相同的示例变量,但每个都有自己的绘图实现,这是相当大和复杂的。这些绘图实现主要由测角计算组成,几乎不共享任何代码。
为了保持代码可读性,我想为每个变量使用一个子类。在子类中,我将定义drawing方法的实现。参见下面的简化示例。
abstract class ScoreItem {
int score;
Color color;
...
abstract void draw();
public class RadarItem extends ScoreItem {
@Override
public void draw() {
// RADAR IMPLEMENTATION
...
}
}
public class LineItem extends ScoreItem {
@Override
public void draw() {
// LINE IMPLEMENTATION
...
}
}
etc.
}
现在,我想使用一个graphic类,其中有一个scoreitems列表。该列表可以包含抽象scoreitem的不同变体,类必须在scoreitems上循环才能绘制它们,如下所示:
public class Graphic {
...
public void generate() {
List<ScoreItem> scoreItems = ...;
for (ScoreItem scoreItem : scoreItems) { scoreItem.draw(); }
}
}
现在这应该管用了;我在一个简单的测试项目中进行了测试。然而,当我遇到问题时;graphic类必须序列化,我在反序列化时遇到了麻烦。这不起作用(java.lang.runtimeexception:未找到抽象类的“class”字段)。我假设gson不能反序列化到抽象类中。当我将scoreitem类更改为常规类时,显然gson反序列化是有效的,但是我不能对子类使用draw()方法。
我希望我对这个问题描述得足够充分和周密。也许使用不同对象类型的列表不是一个好的实践。任何解决方案或建议都将不胜感激。
1条答案
按热度按时间kninwzqo1#
答案将我推向正确的方向,解决方案是使用gson接口适配器(改为抽象适配器)。
如本文所述。