0

抽象親クラスを拡張するいくつかの子クラスがあります。親クラスには、各子のインスタンスを保持する静的な ArrayList が必要です。可能であれば、親クラスのコードを変更せずに子クラスを追加できるようにしたいと考えています。

私が思いついた解決策の 1 つは、子クラスのそれぞれに、それ自体のインスタンスを ArrayList に追加する静的ブロックを与えることです。これに関する唯一の問題は、ブロックをロードして実行するために、各子に何らかの呼び出しを行う必要があることです。

abstract public class Parent {
    protected static ArrayList<Parent> children = new ArrayList<Parent>();
}

public class ChildA extends Parent {
    static {
        children.add(new ChildA());
    }    
}

public class ChildB extends Parent {
    static {
        children.add(new ChildB());
    }    
}

これを回避する方法はありますか?クラスを呼び出さずにクラスをロードできますか? これを行うためのより良い方法はありますか?

編集: これは実際にはタイル ベースのゲーム用です。抽象的な「タイル」クラスと、それを拡張する任意の数のタイル タイプがあります。コードをあちこち変更することなく、ゲームに新しいタイルを簡単に追加できるようにしたいと考えています。これを行う方法についてより良いアイデアがある場合は、提案をお待ちしています。

4

3 に答える 3

0

これをやりたいというあなたの動機は不明ですが、必ずしも内省を伴わない解決策があります。

子クラスを作成する責任をファクトリ クラスに移します。そのファクトリ クラスで、子クラスもリストに挿入します。

これがまさにそれを行うことができるスニペットです。覚えておいてください: リストは にバインドされているため、後でクラスを実際に使用するParentには、正しい子クラス タイプにキャストする必要があります。

public final class ChildFactory {

    private static ChildFactory instance = new ChildFactory();

    private ChildFactory() {

    }

    public <C extends Parent> C generateChild(Class<C> childClass) {
        try {
            final C child = childClass.newInstance();
            Parent.children.add(child);
            return child;
        } catch(InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static ChildFactory getInstance() {
        return instance;
    }
}
于 2014-11-21T23:30:00.627 に答える
0

クラス階層の外でそれを行うことができます。リフレクションを使用して Parent のすべての子孫を検索し、それらをリストに追加するユーティリティ関数を用意します。

于 2014-11-21T23:18:08.517 に答える