又繼續查,發現原來真的有不用instanceof就可以知道現在傳進來的instance是哪種class的方法,就是
instance.getClass().getName()。不同杯子種類的B式喝法很直接的就把他想成一個抽象的喝法家族。所以現在就需要一個class name和喝法的mapping。果然java跟STL一樣有提供現成的map。
接下來的難題就是原本的testbench是把typeBdrink寫成static,然後static函式不能call non-static函式…所以我就把一堆東西改成static…
// abstract class DrinkMethod{} … 不同喝法的東西寫在前面
public class TypeBdrink{
static Map <String, DrinkMethod> map;
static boolean HasInit = false;
public static void MapInit(){
// 不知道為什麼以下看起來是non-static的部份可以執行 ?_?
map = new HashMap<String, DrinkMethod>();
map.put("Cup", new TypeBCup() );
map.put("Mug", new TypeBMug() );
map.put("PaperCup", new TypeBPaperCup() );
}
public static void typeBdrink(Cup c, int n){
if (HasInit == false) {
MapInit();
HasInit = true;
}
String CupType = c.getClass().getName();
DrinkMethod drinkmethod = map.get(CupType);
drinkmethod.drink(c, n);
}
}
以後要增加杯子種類就加在MapInit(),加新的喝法就去繼承DrinkMethod然後重寫喝法內容,看起來還蠻符合要求的。至於為什麼這樣寫可以避開static不能呼叫non-static就不知道了 ?_?,而且這個寫法直接用提供的JUnit testbench會丟InvocationTargetException,但是我自己寫一個main的話是可以執行結果也正常,就當作寫完了吧 XD。
沒有留言:
張貼留言