2012-02-16 78 views
0

我正在用JAVA SE開發一個應用程序,在SQL Server中有一個數據庫。實例化圖像:繼承,分隔的類或其他?

在此應用中,我將有三個類型的圖像:

  • 急救符號
  • 危險符號
  • 績效指標符號

所有圖像具有以下屬性:

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

因此,拳援助和環境績效指標圖像需要這個屬性:

  • isUsedInRiskAssessment - boolean

我的問題:什麼是最好的方法來實現這個結構?

繼承:(在鏈接圖像)

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

我知道繼承是多次被稱爲「邪惡」,但似乎在這種情況下,一個有效的選項,除了有一個子類,而任何其他屬性。

各個班級: http://img580.imageshack.us/img580/511/separated.png

還是其他?

在我的業務層中,我希望能夠將所有圖像(不管最終類型)返回給GUI。 我也有類Image和另一類叫ImageType。但在這種情況下,Image,當ImageType危險標誌,將有一個未使用的屬性 - isUsedInRiskAssessment

這也影響我要在數據庫中創建表的方式。

希望我已經說清楚了。謝謝。

回答

-2

傳承不衰這裏。但有時候需要編寫代碼來確定實際的類型並進行投射, - 你不會喜歡你會得到的代碼。 這就是爲什麼我建議有閒置有時財產Boolean。事實上,三個值:truefalsenull是你所需要的。但請確保在文檔中提及空值的含義。

+0

我按照你的建議,通過使屬性'isUsedInRiskAssessment'一個'Boolean'。通過閱讀Stephan的評論,我還認爲最好是在Enum(在Image類中嵌套Enum),指出圖像的類型。謝謝! – 2012-02-16 14:29:34

+0

不客氣,@PedroDuarte。 – 2012-02-16 16:49:45

+2

有時使用'true','false'和'null'的未使用布爾屬性肯定是一種不好的做法。如果你將不得不添加一個新的類型呢?比你將不得不重寫整個代碼。 **千萬不要這樣做** – user219882 2012-02-16 16:55:05

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(); 

你真的想避免只不同的名字寫作課,這是完全一樣的, - 所以第二個選項是邪惡一。

+0

感謝@Tomas。這是一個很好的答案,但有一個問題:我需要跟蹤正在處理的圖像類型。在我的GUI的管理模塊中,用戶將看到所有圖像,並且我需要知道它的類型。這對於用戶想要將新圖像上傳到數據庫時也是有效的,因爲我需要給它一些'ImageType'。 – 2012-02-16 12:32:56

+0

@Pedro也許你可以使用該http://en.wikipedia.org/wiki/Visitor_pattern Visitor模式。 – user219882 2012-02-16 16:48:14

0

我會創建一個類AbstractImage,它實現了接口IImage。爲了聲明字段,只使用接口。我會爲FirstAidImageEPIImage創建一個擴展類。如果您確實需要區分兩者,請實施ImageType枚舉,但不要實現完全相同的不同類。對於DangerImage創建一個擴展AbstractImage並提供附加屬性的類。