--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/07/10

Double Dispatch っぽいもの

javaの "郷" を知らないおいらは悩める子羊ちゃん - 関数ポインタがない事に対抗する

リフレクションを使うことがポリシー的にどうかはさておき、あげられている問題についてはリフレクションを使うまでもないと思う。

以下のように、Food のサブクラスで FoodGiver への呼び出しメソッドを指定してやればいいんじゃないかなぁ。Double Dispatch ではないけど、それに近いもの。

public class Sample {

    public static void main(String[] args) {
        Food df = new Dogfood();
        Food cf = new Catfood();
        FoodGiver g = new FoodGiver();

        System.out.println(invokeGive(g, df));
        System.out.println(invokeGive(g, cf));
    }

    static void optimizeFood(Food f) {
        class Jam extends Food { }
        f.mix(new Jam());
    }

    static int invokeGive(FoodGiver g, Food f) {
        optimizeFood(f);
        return f.giveTo(g);
    }
}

class Food {
    public void mix(Food f) { }
    public int giveTo(FoodGiver g) { return -1; }
}
class Dogfood extends Food {
    @Override public int giveTo(FoodGiver g) {
        return g.toDog(this);
    }
}
class Catfood extends Food {
    @Override public int giveTo(FoodGiver g) {
        return g.toCat(this);
    }
}

class FoodGiver {
    int toDog(Food f) { return 1; }
    int toCat(Food f) { return 2; }
}

個人的に、リフレクションは最後の手段だと思ってる。便利だけど、遅すぎる。

スポンサーサイト

comment

post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。