2

私は抽象クラスAを持っています

Aを拡張する約10のクラスがあります

クラス A には 1 つまたは 2 つの静的メソッドがあり、これらはインスタンスではなく 10 個のクラスに属しているため、これらが静的であることは理にかなっています。たとえば、1 つの静的メソッドは getAllFromX と呼ばれ、クラスのすべてのインスタンスを X から取得します。それが何であれ、それはサーバーである可能性があります。したがって、これらのメソッドは静的であり、インスタンスにバインドされていないことがわかります。

クラス A に非静的抽象メソッドがあると同時に、各サブクラスはこのメソッドをオーバーライドします (文字列を返すだけです)。静的メソッドはオーバーライドできないため、静的にすることはできません (...)。

要約すると、抽象クラス A には静的メソッドと抽象非静的メソッドがあり、サブクラスによってオーバーライドされます。オーバーライドする必要があるため、2 番目のメソッドを静的にすることはできません。一方、最初のメソッドを非静的にすることもできますが、それは非常に見苦しく悪いプログラミング スタイルになるため、そのままにしておきます。

キャッチ?クラス A の静的メソッドは、非静的メソッドが返す値を取得する必要があります (もちろん、静的メソッドが継承されるサブクラスの場合)。

これを行うためにリフレクションを使用する「最も簡単な」方法はありますか? つまり…本当ですか?

たとえば、静的メソッドがあるクラスを取得します。

Class<?> cl=new Object(){}.getClass().getEnclosingClass(); (a hack I found here, thank god...)

次に、getConstructor を使用して、このサブクラスのオブジェクトを構築します。

次に、このオブジェクトを使用して非静的メソッドを呼び出します。

本当??もっと簡単にできませんか?つまり、プログラムを概念的に正しく設計したい場合...

C#から来て、私はそれが好きではありません(そして型消去のこと)。それはただ醜いです。実行可能ですが、醜いです。そして、少なくとも初心者にとっては大きな障害となります。編集: もう一度読んだ後、次を追加します: /rant end. 申し訳ありませんが、私は実際に気にします。

4

3 に答える 3

1

実際に必要なものは次のとおりだと思います。

public class A {
    public static Set<A> getAllFromX() {
        ...
    }
}

public class B extends A {
    public static Set<B> getAllFromX() {
        ...
    }
}


public class C extends A {
    public static Set<C> getAllFromX() {
        ...
    }
}

(静的メソッドは継承できないため、すべての Enum サブクラスで再定義される列挙型のvalueOf()andメソッドと同様)values()

この場合、各クラスには、必要なことを行う独自の静的メソッドがあります。しかし、あなたの質問はあまり意味がありません。

クラス A の静的メソッドは、非静的メソッドが返す値を取得する必要があります (もちろん、静的メソッドが継承されるサブクラスの場合)。

実際、静的メソッドはサブクラスに継承されません。静的メソッドは継承されません。Aで静的メソッドを定義しfoo()、呼び出す場合

B.foo();

コンパイラはそれをコンパイルすることを拒否しませんが、それを次のように変換します

A.foo();

そのため、常に A であるため、呼び出されるfoo()クラスに依存する何かを実行する方法はありません。foo()

于 2012-12-15T16:34:52.293 に答える
0

いつでもリフレクションを使用して、クラス名を使用してメソッドを呼び出すことができます。

    Object objectX = ClassX.class.newInstance();
    //get your method passing argument types as second param
    Method method = ClassX.class.getDeclaredMethod("methodX", null);
    //invoke your method passing arguments as second param
    method.invoke(objectX, null);

静的メソッドはインスタンスを使用しないとおっしゃっていましたが、リフレクションを使用してインスタンスを取得しているため、実際にはわかりませんが、要件にどのように適合しますか。

抽象クラスに実装されたメソッド(非静的)として作成する方が良い選択だと思います。そうすれば、一度実装すれば、10の拡張クラスすべてで利用できます。

于 2012-12-15T16:22:09.097 に答える
0

あなたの問題は、より大きなデザインの1つだと思います。A またはそのサブクラスのインスタンスの取得は、別のオブジェクトで行う必要があります。ご覧のとおり、静的メソッドをサブクラスに置き換えることに依存することはうまく機能しません。問題のドメインについて詳しく知らなければ、適切な答えを出すことは困難ですが、Abstract Factory パターンに似たものを検討します。

大まかに言えば、メソッド Collection getInstances() を使用して抽象クラス AFactory を定義します。必要に応じて、オーバーライドされた getInstances() メソッドでそのロジックを返し、実装する必要がある A の具体的なサブクラスごとに AFactory を拡張します。実行時に適切なファクトリ サブタイプを取得するために、抽象 AFactory で静的メソッド getFactory(Class) を提供することもできます。

于 2012-12-15T16:42:35.417 に答える