1

以下に示すクラス階層があります。

    public class Rectangle2
    {
        // instance variables 
        private int length;
        private int width;
        /**
         * Constructor for objects of class rectangle
         */
        public Rectangle2(int l, int w)
        {
            // initialise instance variables
            length = l;
            width = w;
        }
        // return the height
        public int getLength()
        {
            return length;
        }
        public int getWidth()
        {
            return width;
        }
        public String toString()
        {
            return "Rectangle - " + length + " X " + width;
        }
public boolean equals( Object b )
           {
               if ( ! (b instanceof Rectangle2) )
               return false;
               Box2 t = (Box2)b;
               Cube c = (Cube)b;
               return t.getLength() == getLength() 
                       && t.getWidth() == getWidth() 
                       && c.getLength() == getLength() 
                       && c.getWidth() == getWidth() ;
}

    }

.

public class Box2 extends Rectangle2
{
    // instance variables 
    private int height;
    /**
     * Constructor for objects of class box
     */
    public Box2(int l, int w, int h)
    {
        // call superclass
        super(l, w);
        // initialise instance variables
        height = h;
    }
    // return the height
    public int getHeight()
    {
        return height;
    }
    public String toString()
    {
        return "Box - " + getLength() + " X " + getWidth() + " X " + height;
    }
         public boolean equals( Object b )
           {
               if ( ! (b instanceof Box2) )
               return false;
               Rectangle2 t = (Rectangle2)b;
               Cube c = (Cube)b;
               return t.getLength() == getLength() 
                       && t.getWidth() == getWidth()  
                       && c.getLength() == getLength() ;
  } 
   }

.

public class Cube extends Box2 {
            public Cube(int length)
             {
              super(length, length, length);
             } 
            public String toString()
    {
        return "Cube - " + getLength() + " X " + getWidth() + " X " + getHeight();
    }

             public boolean equals( Object b )
           {
               if ( ! (b instanceof Cube) )
               return false;
               Rectangle2 t = (Rectangle2)b;
               Box2 c = (Box2)b;
               return t.getLength() == getLength() 
                       && t.getWidth() == getWidth()  
                       && c.getLength() == getLength() 
                       && c.getWidth() == getWidth() 
                       && c.getHeight() == getHeight() ;
  }      
}

equals()あるクラスのインスタンスが他のクラスのインスタンスと等しい場合に、「このクラスの次元はそのクラスの次元と等しい」などのように出力されるようにメソッドを作成しました。これは例です: http://i.stack.imgur.com/Kyyau.png 唯一の問題は、その出力が得られないことです。equals()また、Cube クラスのメソッドを実行しているときに、Box2 クラスからメソッドを継承することはできequals()ますか?

4

3 に答える 3

1

Cube内部へのキャストは失敗し、 aではないa を渡すたびにBox2.equals()a をスローします。コード全体でこのエラーを繰り返します。ClassCastExceptionBox2Cube

if期待どおりに機能するはずですが、ステートメントのブレースを修正することをお勧めします。

実際には、出力が得られるとは思いません。print()コードにorprintln()呼び出しがありません。

また、 内Cube.equals()では、 にキャストbCube、宣言されたCubeオブジェクトから各関数を呼び出す必要があります。ほぼすべてのequals(Object)方法で同じことを行う必要があります。

また、実装では、 and は or をオーバーライドしないので、 andは同じ関数Rectangle2を呼び出すため、毎回同じ出力を返します。についても同様です。CubegetWidth()getLength()t.getWidth()c.getWidth()getLength()

たとえば、Rectangle2クラスは次のようになります。

public class Rectangle2 {

    private final int length;
    private final int width;

    public Rectangle2(int length, int width) {
        this.length = length;
        this.width = width;
    }

    private int getLength() { return length; }
    private int getWidth() { return length; }

    public String toString() {
        return "Rectangle - "+length+" X "+width;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Rectangle2)) {
            return false;
        }
        final Rectangle2 r = (Rectangle2) o;
        return this.getLength() == r.getLength() && 
               this.getWidth() == r.getWidth() &&
               this.getHeight() == r.getHeight();
    }
}

Box2クラスは次のようになります。

public class Box2 extends Rectangle2 {

    private final int height;

    public Box2(int length, int width, int height) {
        super(length, width);
        this.height = height;
    }

    private int getHeight() { return height; }

    public String toString() {
        return "Box - "+length+" X "+width"+ X "+height;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Box2)) {
            return false;
        }
        final Box2 b = (Box2) o;
        return this.getLength() == b.getLength() && 
               this.getWidth() == b.getWidth() &&
               this.getHeight() == b.getHeight();
    }
}

Cubeクラスは次のようになります

public class Cube extends Box2 {

    private final int height;

    public Cube(int length) {
        super(length, length, length);
    }

    public String toString() {
        return "Cube - "+length+" X "+width"+ X "+height;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Cube)) {
            return false;
        }
        final Cube c = (Cube) o;
        return this.getLength() == c.getLength(); // length == width == height
    }

}

System.out.println()その後、コンソールに目的の出力を出力するための呼び出しを追加できるはずです。

finalフィールドは不変であるため、フィールドを として宣言する必要があります。

最後に、似たような名前のクラスが他にもある場合は、番号よりもクラス名を区別する意味のある方法を見つける必要があります。2それ以外の場合は、名前からRectangle2とを削除しBox2ます。

于 2013-03-20T19:14:56.493 に答える
0

return最後のステートメントの後にコードを配置することはできません。到達できなくなります。

「等しい」戻り値をローカル変数に割り当て、それを出力してから返す必要があります。

boolean equal = getLength() == getLength() 
               && t.getWidth() == getWidth()  
               && c.getLength() == getLength() 
               && c.getWidth() == getWidth() 
               && c.getHeight() == getHeight() ;
if (equal) {
    System.out.prinltn("equal");
}

return equal;

メソッドは継承されてequalsいますが、オーバーライドしています。equals拡張クラスの本体でスーパー クラス メソッドを呼び出したい場合super()は、オーバーライドされたメソッドの先頭で呼び出す必要があります。

public boolean equals( Object b ) {
     boolean equal = super.equals(b);
  ... 
于 2013-03-20T19:11:43.167 に答える
0

私の意見では、equals メソッドは次のようになります (クラスを変更するだけです)。

public boolean equals( Object b ) {
    if (b instanceof Rectangle2) {
        Rectangle2 rectangle2 = (Rectangle2)b;
        return this.getLength() == rectangle2.getLength()
            && this.getWidth() == rectangle2.getWidth()
            && this.getHeight() == rectangle2.getHeight();
    } else {
        return false;
    }
}

このメソッドの結果を出力したい場合は、任意の変数に値を代入して出力し、その値を返します。

于 2013-03-20T19:22:19.937 に答える