3

我的代码有问题(编辑:这些类的整个代码)

public abstract class SimplePolygon implements Polygon {

  //protected Vertex2D[] varray; //this is wrong in tests
  public double getWidth(){
    double min = varray[0].getX(), max = varray[0].getX();

    for(int i = 0;i<varray.length;i++){
        max = Math.max(max,varray[i].getX());
        min = Math.min(min,varray[i].getX());
    }
    return max - min;
  }

  public double getHeight(){
    double min = varray[0].getY(), max = varray[0].getY();

    for(int i = 0;i<varray.length;i++){
        max = Math.max(max,varray[i].getY());
        min = Math.min(min,varray[i].getY());
    }
    return max - min;
  }

  public double getLength(){
    double distance = 0;
    for(int i = 0;i<varray.length;i++){
        if((i+1)<varray.length){distance += varray[i].distance(varray[i+1]);}
        else{distance += varray[i].distance(varray[0]);}
    }

    return distance;
  }

  public double getArea(){
    double suma = 0;
    for(int i = 0;i<varray.length-1;i++){
        suma += varray[i].getX()*varray[i+1].getY() - varray[i+1].getX()*varray[i].getY();
    }
    return suma/2;
  }

  public String toString(){
    String str = "Polygon: vertices ="; 
    for(int i = 0;i<varray.length;i++){
        str += " ";
        str += varray[i];
    }
    return str;
  }
}

public class ArrayPolygon extends SimplePolygon {

  public ArrayPolygon(Vertex2D[] array){
    varray = new Vertex2D[array.length];
    if (array == null){}
    for(int i = 0;i<array.length;i++){
        if (array[i] == null){}
        varray[i] = array[i];
    }
  }

  public Vertex2D getVertex(int index) throws IllegalArgumentException{
    return varray[index];
  }

  public int getNumVertices(){
    return varray.length;
  }

}

问题是,我不允许向抽象类添加任何属性或方法SimplePolygon,所以我无法正确初始化varray。它可以简单地用该类中的受保护属性来解决,但由于某些(愚蠢的)原因我不能这样做。有没有人知道如何解决它?感谢所有帮助。

4

4 回答 4

1

考虑到:

  • 你的Polygon界面作为java.util.List界面
  • 你的SimplePoygon抽象类为java.util.AbstractCollection
  • 您的ArrayPolygon具体课程为java.util.ArrayList

我认为你分配的重点是用迭代器实现一个解决方案,这样你就可以在抽象类中实现关于多边形的通用方法,同时在具体类中隐藏包含数据点的实际数据结构;所以:

/* 
 *   This class implements generic methods about polygon, like size, area and 
 *   so on, leveraging on the Vertex2D iterator.
 */
public abstract class SimplePolygon implements Polygon {

    // all concrete subclasses must implement iterator
    public abstract Iterator<Vertex2D> iterator();

    // this generic method prints the vertex list
    // using iterator hides the data structure used in implementation
    public String toString() {
       Iterator<Vertex2D> it = iterator();
       if (! it.hasNext())
           return "[]";

       StringBuilder sb = new StringBuilder();
       sb.append('Polygon: vertices = [');
       for (;;) {
           Vertex2D e = it.next();
           if (! it.hasNext())
               return sb.append("]").toString();
           sb.append(' ');
       }
    }
}

// for instance this concrete classes uses an ArrayList
public ArrayPolygon extends SimplePolygon {

    public Iterator<Vertex2D> iterator() {
       return new .....
    }
}
于 2012-11-05T23:11:43.613 回答
0

如果您需要访问子类变量,您可以通过强制子类通过方法公开该变量来公开该变量。

public abstract class SimplePolygon implements Polygon {
  protected abstract Vertex2D[] getArray();

...

public String toString(){
    String str = "Polygon: vertices ="; 
    Vertex2D[] varray = getArray();
    for(int i = 0;i<varray.length;i++){
        str += " ";
        str += varray[i];
    }
    return str;
}

然后在你的课上:

public class ArrayPolygon extends SimplePolygon
{
private Vertex2D[] varray;
public ArrayPolygon(Vertex2D[] array){
    super(array.length);
    varray = new Vertex2D[array.length];
    if (array == null){}
    for(int i = 0;i<array.length;i++){
        if (array[i] == null){}
        varray[i] = array[i];
    }

  @Override
  protected Vertex2D[] getArray() {return varray;}
  ...
}
于 2012-11-06T01:06:19.817 回答
0

我终于意识到问题出在哪里。答案非常简单……足以在 SimplePolygon 类中将方法 getVertex 和 getNumVertices 声明为抽象。这两种方法从 varray 提供了足够多的信息。所以整个技巧是将 varray.length 和 varray[n] 更改为这些方法。感谢您的时间和帮助。

于 2012-11-06T15:49:29.550 回答
0

首先,这个问题与toString()- 它无关紧要。

您的问题似乎是“如何varray从子类初始化?”。

一种方法是在超类中创建一个构造函数:

public abstract class SimplePolygon implements Polygon {

    protected SimplePolygon(int size) { 
        varray = new Vertex2D[size]; // initialization by super class
    }

    protected SimplePolygon() {} // initialization totally by subclass

}

然后调用构造函数必须适合子类:

public class ArrayPolygon extends SimplePolygon {

    public ArrayPolygon(Vertex2D[] array) {
        varray = array; // use default constructor and initialize it from parameter
    }
}

其他没有传入数组的子类可以调用特殊的构造函数:

public class Square extends SimplePolygon {

    public Square() { // probably pass them in too
        super(4); // we know there's 4 vertices
    }
}


这个问题很笼统,似乎有点毫无意义——目前尚不清楚练习的目标是什么。

于 2012-11-05T23:50:50.027 回答