猿问

强制子类以自身为参数覆盖方法

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


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;

}


繁星点点滴滴
浏览 126回答 2
2回答

偶然的你

如果使抽象类泛型,则可以允许子类将自己指定为参数类型:abstract class Event<T extends Event<T>> {&nbsp; &nbsp; abstract boolean intersect(T object);}子类将能够将它们自己的类型声明为参数。除非您的代码库使用原始类型,否则这应该有效。class SubClassEvent extends Event<SubClassEvent> {&nbsp; &nbsp; &nbsp;@Override&nbsp; &nbsp; boolean intersect(SubClassEvent object){return true;}}这个(或者更确切地说是例外)的限制将是原始类型和其他类型事件的事件,这可以允许其他参数类型。

汪汪一只猫

这在 Java 中是不可能的。考虑您有SubClassEvent实现方法的子类boolean intersect(SubClassEvent e2)。然后,如果它有一个进一步的子类SubSubClassEvent extends SubClassEvent,它将根据继承在 Java 中的工作方式boolean intersect(SubClassEvent e2)从继承方法SubClassEvent。SubSubClassEvent不必覆盖该方法,因为该方法在其超类中是非抽象的SubSubClass。但即使SubSubClassEvent要覆盖该方法,也必须使用签名覆盖它boolean intersect(SubClassEvent)。如果它实现了一个带有签名boolean intersect(SubSubClassEvent)的方法boolean intersect(SubClassEvent),在 Java 方法覆盖规则下,它不会被视为从其超类中覆盖该方法。因此,SubSubClassEvent是Event其intersect方法不将自己的类型作为参数类型的子类,违反了您的条件。
随时随地看视频慕课网APP

相关分类

Java
我要回答