Заставить подкласс переопределить метод, указав его в качестве параметра
У меня есть абстрактный класс 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;
}
Ответы
Ответ 1
Если вы сделаете абстрактный класс универсальным, вы можете позволить подклассам указывать себя как тип параметра:
abstract class Event<T extends Event<T>> {
abstract boolean intersect(T object);
}
Подклассы смогут объявить свой собственный тип в качестве параметра. Если ваша кодовая база не использует необработанные типы, это должно работать.
class SubClassEvent extends Event<SubClassEvent> {
@Override
boolean intersect(SubClassEvent object){return true;}
}
Ограничение этого (или, скорее, исключения из этого) будут необработанными типами и событиями других типов событий, которые могут разрешать другие типы параметров.
Ответ 2
Это невозможно сделать в Java. Предположим, у вас есть подкласс SubClassEvent
который реализует метод boolean intersect(SubClassEvent e2)
. Затем, если у него есть дополнительный подкласс SubSubClassEvent extends SubClassEvent
, он унаследует метод boolean intersect(SubClassEvent e2)
от SubClassEvent
, основываясь на том, как наследование работает в Java.
SubSubClassEvent
не должен переопределять метод, поскольку метод является неабстрактным в своем суперклассе SubSubClass
. Но даже если SubSubClassEvent
хотел переопределить метод, он должен переопределить его с помощью boolean intersect(SubClassEvent)
сигнатуры boolean intersect(SubClassEvent)
. Если бы он реализовал метод с boolean intersect(SubSubClassEvent)
сигнатуры boolean intersect(SubSubClassEvent)
, он не будет рассматриваться как переопределение метода boolean intersect(SubClassEvent)
из своего суперкласса в соответствии с правилами переопределения метода Java.
Следовательно, SubSubClassEvent
является подклассом Event
, метод intersect
которого не принимает свой собственный тип в качестве типа параметра, что нарушает ваше условие.