2

doAction() というメソッドを持つクラス Action があります。このメソッドは、allActions というアクション リストに新しいアクションを追加するたびに上書きするためだけに存在します。

public void doAction() {
    System.out.println("Overload this method.");
} 

アクションのリストは、次のリストに格納されています。

public static List<Action> allActions = new ArrayList<Action>();

次のような呼び出しでこのリストに追加されます。

allActions.add(
    new Action(id){
        public void doAction(Word w1, Word w2) {
            //perform some action
        }
    }
);

しかし、このコードは私にとってはうまくいきません。allActions リストから上書きされた doAction() メソッドにアクセスしようとすると、デフォルトのメソッドが実行されます。

allActions が Action オブジェクトのリストであるため、リストに追加されたときに型が匿名クラスから変更され、デフォルトのメソッドに戻っていることが問題であると思われます。

Action クラスのさまざまな匿名バージョンのリストを維持する方法についてのアイデアはありますか? アクションに与えられた ID に基づいて、これらのさまざまな doAction() メソッドを呼び出せるようにしたいと考えています。

ところで、匿名クラスに遭遇するのはこれが初めてです。概念は理解できると思いますが、実際に使用するのは別の話です。

4

5 に答える 5

7

あなたは使用してpublic void doAction(Word w1, Word w2)いますがpublic void doAction()、親に持っています。したがって、親メソッドはオーバーライドされません。

于 2012-12-07T05:17:46.560 に答える
6
public class Anonymous {
    static class Action {
        int id;
        Action(int id) {
            this.id = id;
        }
        void doAction(){
            System.out.println("Overload this method..."+ id);
        }
    }

    public static void main(String[] args) {
        ArrayList<Action> actions = new ArrayList<Action>();
        actions.add(new Action(0));
        actions.add(new Action(1){void doAction() {System.out.println("Overloading..."+ this.id);}});
        actions.add(new Action(2){void doAction() {System.out.println("Overloading..."+ this.id);}});
        for (Action a: actions) {
            a.doAction();
        }
    }
}

このコードは、Actionクラスのさまざまな匿名バージョンのリストを維持する方法に関する簡単なデモンストレーションです。そしてそれは動作します。

あなたが抱えていた問題は、実際にはメソッドをオーバーライドしなかったということでしたdoAction()。代わりにあなたはそれをオーバーロードしました。

allActionsリストから上書きされたdoAction()メソッドにアクセスしようとすると、デフォルトのメソッドが実行されます。

これは、匿名クラスのすべてのオブジェクトが、誤って元のメソッドをオーバーライドしたと誤って想定しdoAction()たメソッドではなく、Actionクラスから継承されたメソッドを使用したためです。doAction(Word w1, Word w2)

ヒント:一部のメソッドをオーバーライドするときは、メソッドのシグネチャが一貫していることを確認してください。1つの例外は、オーバーライドするメソッドが、オーバーライドされるメソッドのサブタイプのサブタイプの戻り型を持つ可能性があることです。

于 2012-12-07T05:50:07.570 に答える
6

あなたは実際にmethoddoAction()オーバーロードしています。しかし、 overloadoverrideという言葉を混同したのではないかと思います。

メソッドをオーバーロードするには、異なる数量またはタイプのパラメーターを使用します。これにより、呼び出し方 (つまり、どのパラメーターを使用するか) に応じて、同じメソッドで異なることを行うことができます。

オーバーロードに関する情報

superメソッドをオーバーライドするには、同じ量と型のパラメーターを使用し、オーバーライドされた ( ) メソッドと同じ型を返す必要があります。これにより、どこで呼び出すか (つまり、スーパークラスまたはサブクラス) に応じて、同じメソッドで異なる処理を行うことができます。

オーバーライドに関する情報

于 2012-12-07T05:25:41.347 に答える
3

メソッドのオーバーライドとメソッドのオーバーロードの違いをよく読む必要があります。オーバーロードでは、必要に応じて、同じメソッド名で異なるパラメーター リストと戻り値を使用し、それらをすべて同じクラスに含めることができます。オーバーライドでは、基本クラスのメソッドの代わりに使用されるまったく同じメソッド名を持つサブクラスがあります。

おそらく探しているのは、すべてが同じインターフェースを実装するクラスのリストです。たとえば、パラメーターのないメソッドと execute() という void 戻り値の型を含む Action というインターフェイスを使用します。次に、各クラスを作成し、このインターフェイスを実装します。メソッドを呼び出す前に、コンストラクターまたはゲッターとセッターを使用して、オブジェクトの内部状態を設定します。execute メソッドは、既に提供されている状態に対して発生させたいアクティビティをトリガーするだけです。次に、これらの Action オブジェクトをインターフェイス タイプのリストに追加します。

あとは、リストから取得する Action 参照ごとに execute() メソッドを呼び出してリストを反復処理するだけです。

于 2012-12-07T05:36:11.273 に答える