Заставить подкласс переопределить метод с самим собой в качестве параметра - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть абстрактный класс Event, у которого есть абстрактный метод:

abstract boolean intersect(Event object);

Этот метод должен проверять, пересекаются ли два экземпляра подкласса Event на основе переменных экземпляра конкретного подкласса. Я хочу заставить любой подкласс Event переопределить метод на его переменных экземпляра. Каков наилучший способ разработать это? Это моя текущая реализация, которая неверна, так как я меняю тип параметра. Я также пытался использовать интерфейсы, но столкнулся с аналогичными проблемами с параметрами типа.

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

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Это невозможно сделать на Java. Предположим, у вас есть подкласс SubClassEvent, который реализует метод boolean intersect(SubClassEvent e2). Затем, если у него есть дополнительный подкласс SubSubClassEvent extends SubClassEvent, он унаследует метод boolean intersect(SubClassEvent e2) от SubClassEvent, основываясь на том, как наследование работает в Java.

SubSubClassEvent не нужно переопределять метод, поскольку метод не является абстрактным в своем суперклассе SubSubClass. Но даже если SubSubClassEvent хотел переопределить метод, он должен переопределить его с подписью boolean intersect(SubClassEvent). Если бы он реализовал метод с подписью boolean intersect(SubSubClassEvent), он не будет рассматриваться как переопределение метода boolean intersect(SubClassEvent) из его суперкласса в соответствии с правилами переопределения метода Java.

Следовательно, SubSubClassEvent является подклассом Event, чей метод intersect не принимает свой собственный тип в качестве типа параметра, нарушая ваше условие.

0 голосов
/ 05 ноября 2018

Если вы сделаете абстрактный класс универсальным, вы можете разрешить подклассам указывать себя в качестве типа параметра:

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

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

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

Ограничением этого (или, скорее, исключения из этого) будут необработанные типы и события других типов событий, которые могут разрешать другие типы параметров.

...