2013-03-20 6 views
1

J'ai une hiérarchie de classes qui est ci-dessous montrent:objets de classe - Obtenir la mauvaise sortie pour Equals, méthode

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() ; 
    }  
} 

J'ai créé la méthode equals() de sorte que lorsque les instances d'une classe serait égale l'autre, elle écrirait un peu comme « Les dimensions de cette classe égale les dimensions de cette catégorie. » Ce serait un exemple: http://i.stack.imgur.com/Kyyau.png Le seul problème est que je ne reçois pas cette sortie. Aussi pourrais-je juste hériter de la méthode equals() de la classe Box2 quand je fais la méthode equals() pour la classe Cube?

+2

Je ne comprends pas. Comment voulez-vous que votre programme imprime '... est de la même taille que ...' quand vous n'avez pas un seul 'print' /' println' dans tout votre code? – us2012

+1

pourquoi voudriez-vous lancer un Rectangle2 à une instance de sa sous-classe ??? Qui fait cela et pourquoi? – ITroubs

+0

@ us2012 J'ai essayé de mettre un println dans la classe d'égal à égal mais il ne me laissera pas. – user2059140

Répondre

0

Vous ne pouvez pas mettre de code après la dernière instruction return. Ce ne sera pas accessible.

Vous devez attribuer le « égal » retour à une variable locale, l'imprimer et le retourner:

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

return equal; 

Et la méthode equals est héritée, mais vous surchargeons il. Si vous voulez appeler la méthode super classe equals dans le corps de la classe étendue, vous devrez appeler super() au début de la méthode substituée.

public boolean equals(Object b) { 
    boolean equal = super.equals(b); 
    ... 
+1

Où voyez-vous du code inaccessible? – maszter

+0

Je ne l'ai pas fait. Mais la manière de compilateur ne le laissera pas mettre une impression sera ceci. –

1

Votre casting à Cube l'intérieur de Box2.equals() échouera et jeter un ClassCastException chaque fois que vous passez un Box2 qui n'est pas aussi Cube. Vous répétez cette erreur dans votre code.

Je recommande de corriger les accolades de votre instruction if, même si cela devrait fonctionner comme prévu.

Je ne m'attendrais pas à ce que vous obteniez une sortie, en fait. Vous n'avez pas d'appels print() ou println() dans votre code.

De même, à l'intérieur de Cube.equals(), vous devez convertir b en Cube et appeler chaque fonction de l'objet Cube déclaré. Vous devriez faire la même chose dans presque n'importe quelle méthode equals(Object).

Dans votre mise en œuvre, aussi, depuis Rectangle2 et Cube ne sont pas prioritaires getWidth() ou getLength(), t.getWidth() et c.getWidth() appellera les mêmes fonctions et donc retourner la même sortie à chaque fois. De même pour getLength(). Par exemple, votre classe Rectangle2 devrait ressembler à quelque chose comme ceci.

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(); 
    } 
} 

et votre classe Box2 devrait ressembler à quelque chose comme ça.

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(); 
    } 
} 

et votre classe Cube devrait ressembler à ceci

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 
    } 

} 

Vous devriez alors être en mesure d'ajouter un appel à System.out.println() pour imprimer la sortie désirée à la console.

Vous devez déclarer vos champs comme final car ils sont immuables. Enfin, si vous avez d'autres classes avec des noms similaires, vous devriez trouver des façons plus significatives de différencier les noms de classe que les nombres. Sinon, supprimez le 2 des noms Rectangle2 et Box2.

+0

cube a une seule dimension, vous n'avez pas besoin de comparer la longueur, la largeur et la hauteur, l'un d'eux est suffisant – maszter

+0

Certainement, mais je m'attendrais à ce que le compilateur gère cela pour vous. Je n'ai pas beaucoup de préférence de toute façon, donc je vais le changer pour démontrer son possible. – stoooops

0

À mon avis, vos égaux méthodes devraient ressembler à ceci (il suffit de changer les classes):

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; 
    } 
} 

Si vous voulez imprimer résultat de cette méthode, attribuer une valeur à une variable, l'imprimer et retourner cette valeur .

Questions connexes