2016-03-16 2 views
1

J'ai la classe suivante:Mettre en œuvre CompareTo correctement

//GetHasCode, toString, and equalsTo removed to keep the question simple. 
private String weaponName; 
private String weaponType; 
private int weaponDamage; 

public WeaponObject(String name, String type, int damage) 
{ 
    this.weaponName = name; 
    this.weaponType = type; 
    this.weaponDamage = damage; 
} 

@Override 
public int compareTo(WeaponObject compare) { 

int name = this.getWeaponName().compareTo(compare.getWeaponName()); 
int type = this.getWeaponType().compareTo(compare.getWeaponType()); 
int damage = Integer.compare(this.weaponDamage, compare.getWeaponDamage()); 

    if(name !=0) 
    { 
    return name; 
    } 
    if(type != 0) 
    { 
     return type; 
    } 
    if(damage != 0) 
    { 
    return damage; 
    } 
    return 0; 

}

Sous-classe:

public class Sword extends WeaponObject { 


    private String swordAttahment; 

    public Sword(String name, String type, int damage, String attachment) { 
     super(name, type, damage); 
     this.swordAttahment = attachment; 
    } 


    public String getSwordAttahment() { 
     return swordAttahment; 
    } 


    @Override 
    public int compareTo (WeaponObject compare) 
    { 
     int superCompare = super.compareTo(compare); 

     if(superCompare != 0) 
     { 
      return superCompare; 
     } 

     Sword other = (Sword)compare; 

     int attach = this.getSwordAttahment().compareTo(other.getSwordAttahment()); 

     if(attach != 0) 
     { 
      return attach; 
     } 

     return 0; 
    } 

Questions:

  1. Étant donné que J'ai une épée class que extends WeaponObject, ai-je correctement mis en œuvre mon compareTo dans la classe Sword?

  2. Si ce qui précède n'est pas correct, alors comment implémenter correctement la méthode compareTo dans ma sous-classe?

+1

'Sword.compareTo()' 'jetteront un ClassCastException' si vous essayez de comparer à un' WeaponObject'. – shmosel

+0

@shmosel - Comment le réparer? –

+1

WeaponObject n'a pas la méthode 'getSwordAttahment()'. Donc, vous ne pouvez pas faire une comparaison basée sur 'swordAttahment'. – rdonuk

Répondre

-1

WeaponObject n'a pas la méthode getSwordAttahment(). Donc, vous ne pouvez pas faire une comparaison basée sur swordAttahment. Vous pouvez utiliser instanceof pour éviter ClassCastException

@Override 
public int compareTo (WeaponObject compare) 
{ 
    int superCompare = super.compareTo(compare); 

    if(superCompare != 0) 
    { 
     return superCompare; 
    } 

    if(compare instanceof Sword) { 
     Sword other = (Sword)compare; 

     int attach = this.getSwordAttahment().compareTo(other.getSwordAttahment()); 

     if(attach != 0) 
     { 
      return attach; 
     } 
    } 

    return 0; 
} 
+0

Une question de plus, pourrais-je faire this.getClass! = Compare.getClass() return -1? Au lieu de instanceof? –

+0

C'est votre dessication. Si vous pensez que "si les types de classe sont différents, ils doivent être différents", vous pouvez écrire cela. – rdonuk

+0

Un grand merci pour votre réponse, et le code. Très appréciée. –