2013-03-25 55 views
3

這是我的課:通用類的初始化

public class FoodSet<T extends ConcreteFood>{ 
    public List<T> food = new ArrayList<T>(); 
    public FoodSet() 
    { 
     /* 
     * FoodType is an enum containing food types e.g: rice, pork, beef ... 
     */ 
     for(FoodType foodType : FoodType.values()) 
     { 
      /* 
      * 1(*) 
      */
      food.add((T)new ConcreteFood(foodType,0)) 
     }  
    } 
} 

而在1(*)的問題是,如何初始化這份名單中,有「T」型? 現在我用ConcreteFood初始化它,給出參數foodType和amount, 但我的目標是用T來啓動這個列表,它擴展了ConcreteFood。 ConcreteFood的每個子類都可以獲得食物類型和食物數量。 我只是想用適當的ConcreteFood子類初始化這個列表,並且 init每個ConcreteFood對象的foodType和count = 0。 我應該怎麼做?

回答

1

這不是你想要的。您需要一個工廠類來爲您創建ConcreteFood的實例。

public class FoodFactory { 
    private static final FoodFactory INSTANCE = new FoodFactory(); 

    private FoodFactory() {} 

    public static FoodFactory getInstance() { return INSTANCE; } 

    public Food create(FoodType type) { 
     // Put the type checks here 
    } 
} 

我不在乎你的命名。 「ConcreteFood」?聽起來不開胃。爲什麼不FoodCategory?

+0

'ConcreteFood'是誤導,我想他是指那些同意基本食品 – A4L 2013-03-25 12:49:16

+0

的專長,但如果是這樣的話,爲什麼不不是擴展接口食物清單? – duffymo 2013-03-25 12:55:53

+0

這是錯誤開始的地方:) – A4L 2013-03-25 12:57:30

1

你可以使用你的FoodTypeenum作爲工廠:

public static class ConcreteFood { 
} 

public static class Bacon extends ConcreteFood { 
}; 

public static class SavoyCabbage extends ConcreteFood { 
}; 

enum FoodType { 
    Pork { 
    @Override 
    public ConcreteFood makeNew() { 
     return new Bacon(); 
    } 
    }, 
    Cabbage { 
    @Override 
    public ConcreteFood makeNew() { 
     return new SavoyCabbage(); 
    } 
    }; 

    public abstract ConcreteFood makeNew(); 
} 

public static class FoodSet { 
    public List<ConcreteFood> food = new ArrayList<ConcreteFood>(); 

    public FoodSet() { 
    /* 
    * FoodType is an enum containing food types e.g: rice, pork, beef ... 
    */ 
    for (FoodType foodType : FoodType.values()) { 
     /* 
     * 1(*) 
     */ 
     //food.add((T) new ConcreteFood(foodType, 0)) 
     food.add(foodType.makeNew()); 
    } 
    } 
} 
+0

+1 - 我只是編碼完全相同的東西,並想發佈它:/。 – A4L 2013-03-25 13:22:38

+0

我想我的FoodSet 類作爲通用的,所以我認爲你的方式不是我想要實現的。 – friko 2013-03-25 13:35:46

+0

@ A4L - 用「培根」完成?如果不是'Bacon',就不會被認爲是相同的! OldCurmudgeon 2013-03-25 13:36:04

1

針對OP的回答是:你真的不應該想這種方式。我建議你通過正確的混凝土工廠到你的FoodSet

抽象工廠:

public interface FoodFactory<T extends ConcreteFood> { 
    public T create(FoodType type); 
} 

混凝土廠,每ConcreteFood

public class BagFoodFactory implements FoodFactory<BagFood> { 
    private static final BagFoodFactory INSTANCE = new BagFoodFactory(); 

    private BagFoodFactory() {} 

    public static FoodFactory<BagFood> getInstance() { return INSTANCE; } 

    public BagFood create(FoodType type) { 
     return new BagFood(type, 0); 
    } 
} 

子一個使用工廠在FoodSet

public class FoodSet<T extends ConcreteFood> { 
    public List<T> food = new ArrayList<T>(); 

    public FoodSet(FoodFactory<T> factory) { 
     for (FoodType foodType : FoodType.values()) { 
      food.add(factory.create(foodType)); 
     } 
    } 
} 

將正確的工廠構造函數(無論如何,你知道你需要哪一個)。

class Sack 
{ 
    public FoodSet<BagFood> bagFoodSet 
      = new FoodSet<BagFood>(BagFoodFactory.getInstance()); 
} 
+0

謝謝赫斯特,我認爲這是我需要的:)。 – friko 2013-03-25 17:20:26

+0

@friko如果這對你有用,你能接受答案,所以更容易找到其他人嗎? – 2013-03-25 21:26:09