2010-03-01 2 views
2

Je veux créer une classe abstraite en java qui oblige toutes ses sous-classes pour mettre en œuvre un SwingWorker (plus l'abstrait doInBackground() et done() de SwingWorker).Force une sous-classe pour mettre en œuvre sous-classe abstraite

Dans AbstractClass -

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

j'attendre à ce que provoque le compilateur de lancer une exception lorsqu'une classe étendue ne met pas en œuvre, mais il ne fonctionne pas.

Je ne sais pas trop comment j'irais dire que je suis en train de remplacer cette classe abstraite. Est-ce que je le redéfinis dans la classe ConcreteClass comme suit?

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

ou d'une autre manière?

Merci pour votre aide!

Répondre

4

vous devez déclarer les méthodes aussi abstraite, comme ceci:


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

et comment puis-je o verride ceci dans la classe concrète? – chama

+0

par la voie .. \t classe MyImplementationOfTask étend la tâche \t { \t \t @Override \t \t public void doInBackground() { \t \t} \t \t @Override \t \t public void done() { \t \t } \t \t \t} – elou

0

Le premier morceau de code compilera, car la classe Task est également marquée comme abstract et le compilateur accepte qu'il n'implémente pas les membres abstraits de l'ancêtre. Mais vous ne pourrez pas l'instancier (appelez la nouvelle tâche();). La deuxième pièce ne doit pas compiler, car vous n'avez pas implémenté de méthodes abstraites. Pour voir des exemples, faites défiler cette page vers le bas: SwingWorker

3

doInBackground() est abstrait dans SwingWorker, donc toute sous-classe concrète de Task devrait fournir une implémentation. Done(), cependant, n'est pas abstrait dans SwingWorker, donc aucune nouvelle implémentation n'est nécessaire. Si vous voulez forcer vos sous-classes pour réimplémenter vous devez:

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

Pour créer la sous-classe concrète, étendre simplement la tâche comme vous étendez toute autre classe, et remplacer les méthodes abstraites mises en œuvre:

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

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