2

リスナーとしてプライベート抽象クラスがあります。反映されているだけでアクセスできます。そのクラスを実装するにはどうすればよいですか?

public class A {

    private abstract class OnWorkListener {
        public abstract void onWork(int param);
    }

    private OnWorkListener mListener;

    public A(OnWorkListener listener) {
        mListener = listener;
    }

    public void work() {
        // some working
        if(mListener != null) {
            mListener.onWork(0);
        }
    }
}



public class B {

    private static final String TAG = B.class.getSimpleName();

    public B() {
                //How to overwrite it?
        WorkListener listener = new WorkListener() {
            public void onWork(int what) {
                Log.d(TAG, "onWork "+what);
            }
        };
        A a = new A(listener);
        a.work();
    }
}

問題は、抽象クラスのインスタンスを作成できないことです。最初に実装する必要があります。しかし、私は答えを見つけることができません。

4

3 に答える 3

4

リフレクションを使用してクラスまたはインターフェースを実装する方法はありません。ある意味で、リフレクションは「読み取り専用」であり、すでに存在するものを調べて操作することができます。

実行時に実装を構築するには、Javaコードを発行する必要があります。そのために利用できるいくつかのオプションがあります-いくつかの非常に良い参考資料については、この回答をチェックしてください。

于 2013-02-18T15:14:15.550 に答える
0

実際には、1つに2つのエラーがあります。-A.WorkListenerがBから見えない(プライベートであるため)-A.WorkListenerにはAの「囲んでいるインスタンス」が必要です(静的ではないため)

Aのコンストラクターはパブリックであるため、WorkListenerもパブリックとして宣言することは理にかなっています。(ただし、AとBが同じパッケージに含まれている場合は、パッケージの可視性も機能します)。

パブリッククラスA{

    public abstract class WorkListener {
        public abstract void onWork(int param);
    }
...
}
于 2013-02-18T15:29:09.647 に答える
0

クラスBにクラスA内にあるプライベートクラスを実装しようとしています。クラスBはそのクラスをまったく見ることができず、クラスの外部からプライベート属性にアクセスしようとしているようなものです。

質問が実装に言及していて、Bがそれを認識できない理由については、クラスAをリファクタリングし、「内側から外側のレベルに移動」を実行します。これは、プライベートクラスをAまたはBと同じようにクラスにすることを意味します。もう1つのオプションは、公開することです。

于 2013-02-18T15:33:53.257 に答える