扩展抽象类并使用具有不同参数的相同方法

时间:2016-02-28 14:39:24

标签: java abstract-class

首先,这是我的抽象类:

public abstract class GeometricObject2D implements Comparable {
  public abstract boolean contains(GeometricObject2D g);
  public abstract boolean contains(double x, double y);
  public abstract boolean overlaps(GeometricObject2D g);
  public abstract int compareTo(Object temp);
  public abstract double getArea();
  public abstract double getPerimeter();

}

我应该用另外两个类扩展它,ComparableCircle2D和ComparableRectangle2D。两者都包含所有方法,除了它们在 contains 重叠方法中使用自己的参数,例如:

public class ComparableCircle2D extends GeometricObject2D {
//...
  public boolean contains(ComparableCircle2D circle){
  //method
  }
//...
  public boolean overlaps(ComparableCircle2D circle){
  //method
  }
//...
}

这是我得到的错误:

错误:(1,8)java:ComparableCircle2D不是抽象的,并且不会覆盖GeometricObject2D中的抽象方法重叠(GeometricObject2D)。

另一个班同样如此。我不完全明白什么是错的,所以非常感谢解释和解决方案。

P.S:的论点必须保持不变。

4 个答案:

答案 0 :(得分:2)

这是泛型的准确性,请执行以下操作:

abstract class GeometricObject2D<T extends GeometricObject2D> {
  public abstract boolean contains(T g);
}

class ComparableCircle2D extends GeometricObject2D<ComparableCircle2D> {
  public boolean contains(ComparableCircle2D circle){
        return true;
  }
}

答案 1 :(得分:2)

你不能这样做。

在你的类中,你必须覆盖抽象类的所有方法,然后你必须覆盖方法:

 @Override
 public boolean contains(GeometricObject2D g){...}

Hovewer你可以像这样使用somenthing:

public abstract class GeometricObject2D<T extends GeometricObject2D> {
     public abstract boolean contains(T g);
}

在您的子类中:

public class ComparableCircle2D extends GeometricObject2D<ComparableCircle2D> {

    @Override 
    public boolean contains(ComparableCircle2D circle){
      //  return....;
    }
}

答案 2 :(得分:1)

您的类必须实现/覆盖抽象类和接口的所有方法,否则您必须将其标记为abstract

public boolean contains(ComparableCircle2D circle){

这不是有效覆盖,因为contains()中的GeometricObject2D方法需要GeometricObject2D

答案 3 :(得分:1)

您必须具有完全相同的参数才能覆盖方法。因此,您要扩展一个子类,所有抽象方法都必须实现。

这是您的解决方案

public boolean contains(GeometricObject2D circle){
    if (!(circle instanceof ComparableCircle2D)) {
        throw InputMismatchException();
    } else {
    // method
    }
} 

或(取决于您自己的代码的逻辑)

public boolean contains(GeometricObject2D circle){
    if (!(circle instanceof ComparableCircle2D)) {
        return false;
    } else {
    // method
    }
}