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

まず、この質問は関係ありませんtoString()-それは無関係です。

varrayあなたの質問は「サブクラスから初期化するにはどうすればよいですか?」のようです。

これを行う1つの方法は、スーパークラスにコンストラクターを作成することです。

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 に答える
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

私は最終的にどこに問題があるのか​​を理解します。答えは非常に単純です...メソッドgetVertexとgetNumVerticesをクラスSimplePolygonの抽象として宣言するのに十分です。これらの2つの方法は、varrayから十分な情報を提供します。したがって、全体の秘訣は、varray.lengthとvarray[n]をこれらのメソッドに変更することです。お手数をおかけしますが、よろしくお願いいたします。

于 2012-11-06T15:49:29.550 に答える