2

SwingWorkerすべてのサブクラスに a (およびSwingWorkerの抽象doInBackground()and )を強制的に実装する抽象クラスを Java で作成したいと考えていますdone()

AbstractClass で -

abstract class Task extends SwingWorker<Void, Void>{};

これにより、拡張クラスが実装していない場合にコンパイラが例外をスローすることが予想されますが、そうではありません。

また、この抽象クラスをオーバーライドしていることをどのように示すかについてもよくわかりません。次のように ConcreteClass で再宣言しますか?

class Task extends SwingWorker<Void, Void>{
  ...
}

または他の方法ですか?

ご助力いただきありがとうございます!

4

3 に答える 3

4

次のように、メソッドも抽象として宣言する必要があります。


abstract class Task extends SwingWorker {
    @Override
    protected abstract Void doInBackground();
    @Override
    protected abstract void done();
};
于 2010-03-01T16:12:26.690 に答える
3

doInBackground() は SwingWorker では抽象的であるため、Task の具体的なサブクラスは実装を提供する必要があります。

ただし、done() は SwingWorker では抽象的ではないため、新しい実装は必要ありません。サブクラスに強制的に再実装させたい場合は、次のことを行う必要があります。

abstract class Task extends SwingWorker<Void, Void>{
    @Override
    protected abstract void done();
}

具体的なサブクラスを作成するには、他のクラスを拡張するのと同じように Task を拡張し、抽象メソッドを実装でオーバーライドします。

class SubTask extends Task {
    @Override
    protected void done(){
        //implementation
    }

    @Override
    public Void doInBackground(){
        //implementation
    }
}
于 2010-03-01T16:08:01.223 に答える
0

クラス Task も抽象としてマークされており、コンパイラは先祖の抽象メンバーを実装していないことを受け入れるため、コードの最初の部分がコンパイルされます。ただし、それをインスタンス化することはできません ( new Task(); を呼び出します)。抽象メソッドを実装していないため、2 番目の部分はコンパイルされません。例を見るには、このページを下にスクロールしてください: SwingWorker

于 2010-03-01T16:05:20.383 に答える