为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星点点滴滴 2021-12-30 17:07:55
我有一个抽象事件类,它有一个抽象方法:abstract boolean intersect(Event object);此方法应根据特定子类的实例变量检查 Event 子类的两个实例是否相交。我想强制 Event 的任何子类覆盖其实例变量上的方法。设计这个的最佳方法是什么?这是我当前的实现,这是错误的,因为我正在更改参数类型。我也尝试过使用接口,但遇到了类似的类型参数问题。@Overridepublic 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 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

如果使抽象类泛型,则可以允许子类将自己指定为参数类型:


abstract class Event<T extends Event<T>> {

    abstract boolean intersect(T object);

}

子类将能够将它们自己的类型声明为参数。除非您的代码库使用原始类型,否则这应该有效。


class SubClassEvent extends Event<SubClassEvent> {

     @Override

    boolean intersect(SubClassEvent object){return true;}

}

这个(或者更确切地说是例外)的限制将是原始类型和其他类型事件的事件,这可以允许其他参数类型。


查看完整回答
反对 回复 2021-12-30
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

这在 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 方法覆盖规则下,它不会被视为从其超类中覆盖该方法。

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


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信