2

我想在java中创建一个抽象类,强制它的所有子类实现a SwingWorker(加上SwingWorker's abstract doInBackground()and 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(); )。第二部分不应该编译,因为你没有实现抽象方法。要查看示例,请向下滚动此页面:SwingWorker

于 2010-03-01T16:05:20.383 回答