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;
}
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.
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.