实例化图像:继承,分隔的类还是其他?

时间:2012-02-16 12:15:16

标签: java inheritance

我正在使用SQL Server中的数据库在JAVA SE中开发应用程序。

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

  • 急救符号
  • 危险符号
  • EPIs符号

所有图片具有以下属性:

  • imageID - int
  • imageDescription - String
  • image - ImageIcon

因此,拳头援助和EPIs图像需要这个属性:

  • isUsedInRiskAssessment - boolean

我的问题:实施这种结构的最佳方法是什么?

继承:(链接中的图片)

http://img194.imageshack.us/img194/6871/inheritance.png

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

分隔的课程 http://img580.imageshack.us/img580/511/separated.png

还是其他?

在我的业务层,我希望能够将所有图像(无论哪种类型)返回到GUI。 我还想要一个班级Image和另一个名为ImageType的班级。但在这种情况下,当Image 危险符号时,ImageType会有一个未使用的属性 - isUsedInRiskAssessment

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

希望我已经清楚地解释了自己。感谢。

3 个答案:

答案 0 :(得分:1)

在这种情况下,继承是如何实现这一点的好方法。但我认为用这样的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();

你真的想避免编写完全相同但只有不同名称的类 - 所以第二个选项是 evil

答案 1 :(得分:0)

我会创建一个实现接口AbstractImage的类IImage。对于声明字段,仅使用接口。我会为FirstAidImageEPIImage创建一个扩展类。如果您确实需要区分两者,请实现ImageType枚举,但不要实现完全相同的不同类。对于DangerImage,创建一个扩展AbstractImage的类并提供其他属性。

答案 2 :(得分:-2)

这里的继承并不差。但有时候有必要编写确定实际类型并进行转换的代码, - 你不会喜欢你会得到的代码。 这就是我建议有时使用Boolean属性的原因。实际上,您需要三个值:truefalsenull。但请确保在文档中提到null值的含义。