2010-03-01 4 views
2

Я хочу, чтобы создать абстрактный класс в Java, который заставляет все его подклассы реализовать SwingWorker (плюс SwingWorker «s абстрактные doInBackground() и done()).Force подкласс реализовать абстрактный подкласс

В AbstractClass -

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

Я бы ожидать, что это вызовет компилятор сгенерирует исключение, когда расширенный класс не реализует его, но это не так.

Я также не совсем уверен, как бы я сказал, что я переопределяю этот абстрактный класс. Я обновляю его в ConcreteClass следующим образом?

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

или каким-либо другим способом?

Спасибо за вашу помощь!

ответ

4

вам необходимо объявить методы также, как абстрактные, так:


abstract class Task extends SwingWorker { 
    @Override 
    protected abstract Void doInBackground(); 
    @Override 
    protected abstract void done(); 
}; 
+0

, а затем, как я о verride это в конкретном классе? – chama

+0

кстати .. \t класса MyImplementationOfTask расширяет задача \t { \t \t @Override \t \t общественного недействительный doInBackground() { \t \t} \t \t @Override \t \t общественность недействительным сделано() { \t \t } \t \t \t} – elou

0

Первый фрагмент кода будет скомпилирован, поскольку класс Task также отмечен как абстрактный, и компилятор соглашается с тем, что он не реализует абстрактных членов предка. Но вы не сможете его создать (вызовите новую задачу();). Вторая часть не должна компилироваться, потому что вы не реализовали абстрактные методы. Чтобы увидеть примеры, прокрутите страницу вниз: SwingWorker

3

doInBackground() является абстрактным в SwingWorker, поэтому любой конкретный подкласс Задачи должен обеспечить реализацию.

done(), однако, не является абстрактным в SwingWorker, поэтому новая реализация не требуется. Если вы хотите, чтобы ваши подклассы переопределять это вам нужно:

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

Чтобы создать конкретный подкласс, просто расширить задачи, как вы бы расширить любой другой класс, и переопределить абстрактные методы с реализациями:

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

    @Override 
    public Void doInBackground(){ 
     //implementation 
    } 
}