强制子类重写方法,并将自身作为参数

我有一个抽象的事件类,它有一个抽象的方法:

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中是不可能的。假设您有实现该方法的子类。然后,如果它有另一个子类,它将根据继承在Java中的工作方式从 继承该方法。SubClassEventboolean intersect(SubClassEvent e2)SubSubClassEvent extends SubClassEventboolean intersect(SubClassEvent e2)SubClassEvent

SubSubClassEvent不必重写该方法,因为该方法在其超类中是非抽象的。但是,即使要重写该方法,也必须使用 签名 覆盖它 。如果它实现了一个带有签名的方法,那么在Java方法重写规则下,它不会被视为从其超类中重写该方法。SubSubClassSubSubClassEventboolean intersect(SubClassEvent)boolean intersect(SubSubClassEvent)boolean intersect(SubClassEvent)

因此,是其方法不将其自己的类型作为参数类型的子类,这违反了您的条件。SubSubClassEventEventintersect


推荐