Java 实例化映像:继承、分离类还是其他?

Java 实例化映像:继承、分离类还是其他?,java,inheritance,Java,Inheritance,我正在用JavaSE开发一个应用程序,SQL Server中有一个数据库 在此应用程序中,我将有三种图像: 急救符号 危险符号 EPIs符号 所有图像都具有以下属性: imageID-int imageDescription-字符串 图像-图像图标 因此,急救和EPIs图像需要此属性: 用于风险评估-布尔值 我的问题是:实现这种结构的最佳方法是什么 继承:(链接中的图像) 我知道继承多次被称为“邪恶”,但在这种情况下似乎是一个有效的选择,除了拥有一个没有任何其他属性的子类 分离类:

我正在用JavaSE开发一个应用程序,SQL Server中有一个数据库

在此应用程序中,我将有三种图像:

  • 急救符号
  • 危险符号
  • EPIs符号
所有图像都具有以下属性:

  • imageID-int
  • imageDescription-字符串
  • 图像-图像图标
因此,急救和EPIs图像需要此属性:

  • 用于风险评估-布尔值
我的问题是:实现这种结构的最佳方法是什么

继承:(链接中的图像)

我知道继承多次被称为“邪恶”,但在这种情况下似乎是一个有效的选择,除了拥有一个没有任何其他属性的子类

分离类:

还是别的

在我的业务层中,我希望能够将所有图像(无论哪种类型)返回到GUI。 我还希望有一个类
Image
和另一个类
ImageType
。但是在这种情况下,
图像
,当
图像类型
是危险符号时,将有一个未使用的属性-
用于风险评估

这也会影响我在数据库中创建表的方式


希望我已经解释清楚了。谢谢。

在本例中,继承是一种很好的实现方法。但我认为最好创建一个子类,使用
isUsedInRiskAssessment
,如下所示:

class Image {
    private int imageId;
    private String imageDescription;
    private ImageIcon image;

    ...
}

// I can't come up with a proper name right now
class ImageChild extends Image { 
    private boolean isUsedInRiskAssessment;

    ...
}

Image firstAidImage = new ImageChild();
Image epiImage = new ImageChild();
Image dangerImage = new Image();

您确实希望避免编写完全相同、只是名称不同的类-因此第二个选项是邪恶的。

我将创建一个类
AbstractImage
,它实现接口
IImage
。对于声明字段,仅使用接口。我将为
FirstAidImage
epimage
创建一个扩展类。如果确实需要区分两者,请实现
ImageType
enum,但不要实现完全相同的不同类。对于
DangerImage
创建一个扩展
AbstractImage
并提供附加属性的类。

这里的继承不错。但有时需要编写确定实际类型的代码并进行转换,-您不会喜欢您将获得的代码。
这就是为什么我建议有时使用未使用的
Boolean
属性。实际上,您需要三个值:
true
false
null
。但请确保在文档中提到空值的含义。

谢谢@Tomas。这是一个很好的答案,但有一个问题:我需要跟踪我正在处理的图像类型。在我的GUI的管理模块中,用户将看到所有的图像,我需要知道它的类型。当用户想要将新图像上传到数据库时,这也是有效的,因为我需要给它某种类型的
ImageType
@Pedro,也许你可以使用访问者模式。我按照你的建议,将属性
设置为isUsedInRiskAssessment
a
Boolean
。通过阅读Stephan的评论,我还认为最好有一个Enum(图像类中的嵌套Enum),指示图像的类型。谢谢有时使用
true
false
null
的未使用的布尔属性肯定是一种不好的做法。如果您必须添加新类型,该怎么办?然后你必须重写整个代码。“永远不要这样做,谢谢你,”托马斯,考虑这一点非常重要。