2014-02-21 54 views
0

這是一個非常基本的java問題。Java多態性利用率

我有一個超類。

public class MenuItem { 

    private int itemId; 

    public int getItemId() { 
     return itemId; 
    } 

    public void setItemId(int itemId) { 
     this.itemId = itemId; 
    } 

} 

然後子類:

public class Beverage extends MenuItem { 

    private PriceSML price; 

    public PriceSML getPrice() { 
     return price; 
    } 

    public void setPrice(PriceSML price) { 
     this.price = price; 
    } 

} 

    public class Cake extends MenuItem { 

     private SugarLevel sugarLevel; 

     public SugarLevel getSugarLevel() { 
      return sugarLevel; 
     } 

     public void setSugarLevel(SugarLevel price) { 
      this.sugarLevel= sugarLevel; 
     } 

    } 

然後我創建了一個DAO方法:

public boolean createItem(MenuItem menuItem) { 
     boolean result = false; 
     try { 
      Connection conn = createConnection(); 
      Statement stmt = conn.createStatement(); 

      String query = "INSERT INTO menu (menu_id, price) 
        + "VALUES ('" 
        + MenuItem.getItemCode() 
        + "')"; 
        //NOTE: HOW TO GET THE PRICE AND PUT IT IN MY QUERY 

      stmt.executeUpdate(query); 
      result = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
} 

但我怎麼能得到PriceSML價格,因爲它是在飲料?即使我通過它像這樣

MenuItem menuItem = new Beverage(); 

所以我決定這樣做:

public boolean createBeverageItem(Beverage beverage) { 

} 

public boolean createCakeItem(Cake Cake) { 

} 

等等...(例如100多個方法,如果我有100個類別)。請注意,我只訪問數據庫中的菜單表。那我該如何做得更好?

謝謝。

+1

車輪:我們已經有了。 http://docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html :) – Affe

+0

其他類的'SugarLevel'和'SMLPrice'子類是什麼?就像一些價格屬性一樣的價格類? – everton

+0

請記住,在很多情況下,繼承是一種反模式。看到[這個問題](http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) – olivieradam666

回答

2

要做到這一點,泛泛而談。

而不是使MenuItem的子類只使用一個類MenuItem並在其中有一個HashMapHashMap然後將鍵映射到MenuItem的所有屬性的值。然後,您可以使用將MenuItem表與MenuItemProperties表連接起來的一對多關係將它們存儲在數據庫中。

試圖做到這一點,你所做的事很快就會下降,因爲你實際上不能用MenuItem做任何事情,而不知道它是什麼類型。

還要注意,您直接將值插入到您的查詢字符串中。儘管對於整數值來說這是足夠安全的,但這仍然是一種不好的做法,並且非常危險的是您有沒有String值。

+0

爲什麼要刪除整數值安全但對String值危險? – newbie

+2

由於SQL注入導致它不好 - http://en.wikipedia.org/wiki/SQL_injection –

+1

請注意,SQL注入可能會意外以及惡意發生。例如,如果您有一個名稱O'Neil並將其放入SQL查詢中,但沒有正確轉義它,則會出現各種隨機錯誤。 –

0

使MenuItem和抽象類具有抽象方法getPrice()。然後在你的子類中覆蓋它。

+1

這將是一個很好的答案...除了他有價格和sugarLevel是完全不同的屬性。 –

+0

看着DAO,看起來他只想插入menu_id和price。 – aglassman

+0

這只是一個例子..它不是我的實際道路 – newbie

0

而是採用

MenuItem menuItem = new Beverage(); 

必須使用

Beverage beverage= new Beverage(); 

它可以讓你使用類菜單項的功能以及set和get PriceSML價格

0

爲什麼不呢?

if(menuItem instanceof Beverage){ 
     ((Beverage) menuItem).createBeverageItem(myBeverage) 
    } 
1

爲每個要保留的bean創建一個DAO類。在其中實現SQL語句構建和JDBC調用,每個調用都保存特定於某個特定Bean的屬性。 當然,很可能所有的DAO都將是一些實現通用代碼的普通類的所有子類。它們之間的繼承通常取決於你的數據模型以及如何映射到你的bean。我想你已經知道了:)

現在,所有的DAO都實現一個通用接口,並使用它來訪問它們(即這樣的接口將聲明你的方法和更新的類似方法,要創建它們的實例,一個工廠類,這將爲他們提供,它可以根據getClass()呼叫豆做,internaly保持在地圖bean類的到DAO的一個緩存的DAO。

。利用的JPA(正如有人在上面的評論中所說的),或者選擇其他的ORM框架。