代码之家  ›  专栏  ›  技术社区  ›  Nicolae Stroncea

强制子类重写自身作为参数的方法

  •  14
  • Nicolae Stroncea  · 技术社区  · 7 年前

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

    abstract boolean intersect(Event object);
    

    此方法应基于特定子类的实例变量检查事件子类的两个实例是否相交。我想强制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 回复  |  直到 7 年前
        1
  •  12
  •   ernest_k Petronella    7 年前

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

    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
  •  0
  •   newacct    7 年前

    这在Java中是不可能做到的。考虑你有你的子类 SubClassEvent 实现方法的 boolean intersect(SubClassEvent e2) . 如果它还有一个子类 SubSubClassEvent extends SubClassEvent ,它将继承该方法 布尔相交(子类e2) 子类 ,基于继承在Java中的工作方式。

    SubSubClassEvent SubSubClass . 但即使 子类事件 boolean intersect(SubClassEvent) . 如果它实现了一个带有签名的方法 boolean intersect(SubSubClassEvent) ,则不会将其视为对该方法的重写 从它的超类,在Java方法重写规则下。

    因此, 子类事件 是的一个子类 Event intersect