Заставить подкласс реализовывать абстрактный подкласс - PullRequest
2 голосов
/ 01 марта 2010

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

В AbstractClass -

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

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

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

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

или как-то иначе?

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

Ответы [ 3 ]

4 голосов
/ 01 марта 2010

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


abstract class Task extends SwingWorker {
    @Override
    protected abstract Void doInBackground();
    @Override
    protected abstract void done();
};
3 голосов
/ 01 марта 2010

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
    }
}
0 голосов
/ 01 марта 2010

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

...