Java 实例化映像:继承、分离类还是其他?
我正在用JavaSE开发一个应用程序,SQL Server中有一个数据库 在此应用程序中,我将有三种图像:Java 实例化映像:继承、分离类还是其他?,java,inheritance,Java,Inheritance,我正在用JavaSE开发一个应用程序,SQL Server中有一个数据库 在此应用程序中,我将有三种图像: 急救符号 危险符号 EPIs符号 所有图像都具有以下属性: imageID-int imageDescription-字符串 图像-图像图标 因此,急救和EPIs图像需要此属性: 用于风险评估-布尔值 我的问题是:实现这种结构的最佳方法是什么 继承:(链接中的图像) 我知道继承多次被称为“邪恶”,但在这种情况下似乎是一个有效的选择,除了拥有一个没有任何其他属性的子类 分离类:
- 急救符号
- 危险符号
- EPIs符号
imageID-int
imageDescription-字符串
图像-图像图标
用于风险评估-布尔值
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
aBoolean
。通过阅读Stephan的评论,我还认为最好有一个Enum(图像类中的嵌套Enum),指示图像的类型。谢谢有时使用true
、false
和null
的未使用的布尔属性肯定是一种不好的做法。如果您必须添加新类型,该怎么办?然后你必须重写整个代码。“永远不要这样做,谢谢你,”托马斯,考虑这一点非常重要。