2016-11-23 9 views
0

私は2つのインターフェースと1つのクラスを実装しています。インタフェースでは、私は1つの通常の方法と1つの一般的な方法を示しました。 mainメソッドでそれらを実装する場合、通常のメソッドは正しい結果を示しますが、一般的なメソッドはそうではありません。可能であれば、increase_twice()メソッドが正しい結果を返さない理由を教えてください。ここに私のコードは次のとおりです。Javaのインターフェースから汎用メソッドを実装する

Rectangle.java:

public class Rectangle implements TwoDShape { 

    private double width, height; 

    public Rectangle (double width, double height) { 
     this.width = width; 
     this.height = height; 
    } 

    public double area() { 
     return width * height; 
    } 

    public double perimeter() { 
     return 2.0 * (width + height); 
    } 

    public void describe() { 
     System.out.println("Rectangle[width=" + width + ", height=" + height + "]"); 
    } 

    @Override 
    public Rectangle increase_twice() { 
     // TODO Auto-generated method stub 
     return new Rectangle(2*this.width, 2*this.height); 
    } 


} 

TwoDShape.java:

public interface TwoDShape extends GeometricShape { 
    public double area(); 


} 

GeometricShape.java:

public interface GeometricShape<T extends GeometricShape<T>> 
{ 
    public void describe(); 
    public T increase_twice(); 

} 

そして最後にテストクラスArrayListExample.java

import java.util.ArrayList; 


public class ArrayListExample { 



    public static void describe_all(ArrayList<? extends GeometricShape> shapes) 

    { 
     for(int i=0;i<shapes.size();i++) 
     { 
      shapes.get(i).describe(); 

     } 
     System.out.println("Total number of shapes:"+ shapes.size()); 
    } 


    private static ArrayList<Rectangle> increase_size(ArrayList<Rectangle> rects) 
    { 
      for(int i=0;i<rects.size();i++) 
      { 
      rects.get(i).increase_twice(); 

      } 
     return rects; 

    } 


    public static void main(String[] args) { 


     System.out.println("The result of describe() method:"); 

     System.out.println(); 
     System.out.println("Example rectangles"); 
     ArrayList<Rectangle> rects = new ArrayList<Rectangle>(); 
     rects.add(new Rectangle(2.0, 3.0)); 
     rects.add(new Rectangle(5.0, 5.0)); 
     describe_all(rects); 
     System.out.println(); 

     System.out.println("The result of increase_twice() method:"); 
     System.out.println(); 
     System.out.println("Example rectangles after increase:"); 
     ArrayList<Rectangle> double_rects = increase_size(rects); 
     describe_all(double_rects); 

    } 


} 

Rectangle [幅= 4.0、高さ= 6.0] 長方形[幅= 10.0、高さ= 10.0]を持つ矩形を返すことを期待していますが、代わりに の長方形[幅= 2.0、height = 3.0] 長方形[幅= 5.0、高さ= 5.0] 可能であれば、間違いをどこにしてくださいか教えてください。

答えて

1

私は問題がincrease_twice機能にあると思います。 rects.get(i).increase_twice();を呼び出しているときは、実際には倍の値を持つ新しいRectangleオブジェクトを作成して返します。現在のオブジェクトを更新していません。 increase_twice方法は次のようになります。

@Override 
    public void increase_twice() { 
     // TODO Auto-generated method stub 
     this.width *= 2; 
     this.height *= 2; 
    } 

この方法であなたはArrayListのから得ている現在のオブジェクトの幅と高さの値を更新します。 新しいRectangleオブジェクトを返す必要はないと思うので、increase_twice()の定義を変更する必要があります。

それが動作するかどうかを教えてください。

+1

非常にありがとう@ヤン、はい、それは理解した –

+0

それは素晴らしいです。ハッピーコーディング! – Yan

1

Rectangle.increase_twice()は新しいオブジェクトを返します。ただし、ArrayListExample.increase_size()では、返されるオブジェクトは設定されません。あなたはこれにその方法を変更することがあり :

private static ArrayList<Rectangle> increase_size(ArrayList<Rectangle> rects) { 
    for (int i = 0; i < rects.size(); i++) { 
     rects.set(i, rects.get(i).increase_twice()); 
    } 
    return rects; 
} 

それとも、これにRectangle.increase_twiceを()修正することがあります。

@Override 
    public void increase_twice() { 
     // TODO Auto-generated method stub 
     this.width = 2 * this.width; 
     this.height = 2 * this.height; 
    } 

そして、これまでGeometricShape.increase_twice()宣言:

public void increase_twice(); 
関連する問題