it-swarm.com.de

Zwingt die Subklasse, die Methode mit sich selbst als Parameter zu überschreiben

Ich habe eine abstrakte Event-Klasse, die eine abstrakte Methode hat:

abstract boolean intersect(Event object);

Diese Methode sollte prüfen, ob sich zwei Instanzen einer Event-Unterklasse basierend auf den Instanzvariablen der jeweiligen Unterklasse schneiden. Ich möchte, dass jede Unterklasse von Event die Methode für ihre Instanzvariablen überschreibt. Wie lässt sich das am besten gestalten? Dies ist meine aktuelle Implementierung, die falsch ist, da ich den Parametertyp ändere. Ich habe auch versucht, Schnittstellen zu verwenden, habe aber ähnliche Probleme mit Typparametern gehabt.

@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

Wenn Sie die abstrakte Klasse als generisch definieren, können Sie zulassen, dass sich Unterklassen als Parametertyp angeben:

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

Unterklassen können ihren eigenen Typ als Parameter deklarieren. Wenn Ihre Codebase keine Raw-Typen verwendet, sollte dies funktionieren.

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

Die Einschränkung (oder eher Ausnahmen davon) sind Rohtypen und Ereignisse anderer Ereignistypen, die andere Parametertypen zulassen.

12
ernest_k

Dies ist in Java nicht möglich. Stellen Sie sich vor, Sie haben Ihre Unterklasse SubClassEvent, die die Methode boolean intersect(SubClassEvent e2) implementiert. Wenn dann eine weitere Unterklasse SubSubClassEvent extends SubClassEvent vorhanden ist, erbt sie die Methode boolean intersect(SubClassEvent e2) von SubClassEvent, je nachdem, wie die Vererbung in Java funktioniert.

SubSubClassEvent muss die Methode nicht überschreiben, da die Methode in ihrer Oberklasse SubSubClass nicht abstrakt ist. Aber selbst wenn SubSubClassEvent die Methode überschreiben wollte, muss sie mit der Signatur boolean intersect(SubClassEvent) überschrieben werden. Wenn eine Methode mit der Signatur boolean intersect(SubSubClassEvent) implementiert wird, wird sie nicht als Überschreibung der Methode boolean intersect(SubClassEvent) aus ihrer Superklasse betrachtet, wenn die Java-Methode Regeln überschreibt.

Daher ist SubSubClassEvent eine Unterklasse von Event, deren intersect-Methode keinen eigenen Typ als Parametertyp annimmt, der Ihre Bedingung verletzt.

0
newacct