web-dev-qa-db-fra.com

Forcer la sous-classe à remplacer la méthode par elle-même en tant que paramètre

J'ai une classe d'événement abstraite qui a une méthode abstraite:

abstract boolean intersect(Event object);

Cette méthode doit vérifier si deux instances d'une sous-classe Event se croisent en fonction des variables d'instance de la sous-classe particulière. Je veux forcer n'importe quelle sous-classe de Event à écraser la méthode sur ses variables d'instance. Quelle est la meilleure façon de concevoir cela? Ceci est mon implémentation actuelle, ce qui est faux car je change le type de paramètre. J'ai également essayé d'utiliser des interfaces, mais j'ai rencontré des problèmes similaires avec les paramètres de type.

@Override
public boolean intersect(SubClassEvent e2) {

    boolean intersects = false;
    if(this.weekDay == e2.weekDay) {
        if (this.getStartTime() < e2.getStartTime() && this.getEndTime() > e2.getStartTime()) {
            intersects = true;
        }
        else if(this.getStartTime() >= e2.getStartTime() && this.getStartTime() < e2.getEndTime()){
            intersects = true;
        }
    }
    return intersects;
}
14
Nicolae Stroncea

Si vous rendez la classe abstraite générique, vous pouvez autoriser les sous-classes à se spécifier en tant que type de paramètre:

abstract class Event<T extends Event<T>> {
    abstract boolean intersect(T object);
}

Les sous-classes pourront déclarer leur propre type en tant que paramètre. À moins que votre base de code utilise des types bruts, cela devrait fonctionner.

class SubClassEvent extends Event<SubClassEvent> {
     @Override
    boolean intersect(SubClassEvent object){return true;}
}

La limitation de ceci (ou plutôt des exceptions à cela) sera les types bruts et les événements d'autres types d'événements, qui peuvent autoriser d'autres types de paramètres.

12
ernest_k

Ce n'est pas possible à faire en Java. Considérez que vous avez votre sous-classe SubClassEvent qui implémente la méthode boolean intersect(SubClassEvent e2). Ensuite, s'il comporte une autre sous-classe SubSubClassEvent extends SubClassEvent, il héritera de la méthode boolean intersect(SubClassEvent e2) de SubClassEvent, en fonction du fonctionnement de l'héritage en Java.

SubSubClassEvent ne doit pas forcément remplacer la méthode car celle-ci est non abstraite dans sa superclasse SubSubClass. Mais même si SubSubClassEvent voulait substituer la méthode, il doit la remplacer par la signature boolean intersect(SubClassEvent). Si elle implémentait une méthode avec la signature boolean intersect(SubSubClassEvent), elle ne serait pas considérée comme une substitution de la méthode boolean intersect(SubClassEvent) de sa superclasse, sous les règles de substitution de la méthode Java.

Par conséquent, SubSubClassEvent est une sous-classe de Event dont la méthode intersect ne prend pas son propre type en tant que type de paramètre, violant votre condition.

0
newacct