Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    Metodo equals ed ereditarietà tra classi

    Ragazzi io ho una classe operaio (classe Op) in cui ho i seguenti attributi:
    nome (String) e salario (short), mentre un operaio specializzato
    (classe OpSp, sottoclasse di Op), in aggiunta possiede una specializzazione (riferimento ad un oggetto di tipo Specialty).

    Devo implementare(usando equals) questo criterio di uguaglianza:
    Due operai semplici sono uguali se hanno lo stesso nome. Due operai specializzati, in più, devono avere anche la stessa specializzazione (nel senso di ==). Un operaio semplice non è mai uguale ad un operaio specializzato.

    Io avevo pensato di mettere sicuramente in Op equals in questo modo:

    codice:
    public class Op {
       String nome;
       short salario;
    
       public Op {...}
    
       public boolean equals(Object o) {
         if (!(o instanceof Op) return false;
         Op operaio = (Op)o;
         
         return nome.equals(operaio.nome);
       }
    }
    
    public class OpSp extends Op {
     // qui come ridefinisco equals ?
    }
    poichè nome è di tipo String, facendo nome.equals(operaio.nome), richiama equals di String confrontanto se i nomi sono uguali, giusto?

    Come potrei fare riguardo la specializzazione, salvo restando che ho fatto bene per la classe Op.
    Con i sogni possiamo conoscere il futuro...

  2. #2
    codice:
    public class Op {
       String nome;
       short salario;
    
       public Op {...}
    
       public boolean equals(Object o) {
         if (!(o instanceof Op) return false;
         Op operaio = (Op)o;
         
         return nome.equals(operaio.nome);
       }
    }
    
    public class OpSp extends Op {
       Speciality specializzazione;
    
       public OpSp {...}
    
       @Override
       public boolean equals(Object o) {
         if (!(o instanceof OpSp) return false;
         OpSp operaio = (OpSp)o;
         
         return nome.equals(operaio.nome);
       }
    }

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Io avevo pensato ad una cosa del genere, magari qualcuno che acconsente o specifica eventuali errori:

    codice:
    public class Op {
       String nome;
       short salario;
    
       public Op {...}
    
       public boolean equals(Object o) {
         if (o.getClass() != Op.class) return false;
         Op operaio = (Op)o;
         
         return nome.equals(operaio.nome);
       }
    }
    
    public class OpSp extends Op {
       Speciality spec;
    
       public boolean equals(Object o) {
         if (o.getClass() != OpSp.class) return false;
         
         if ( !(super.equals(o) ) return false;
    
         OpSp operaio = (OpSp)o;    
    
         return ( spec == operaio.spec);
       }
    }
    Grazie anticipatamente.
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    ps1: Op e OpSp sono nomi orrendi, cerca di migliorare la leggibilità.
    ps2: nell'equals non hai controllato il caso "null" e il caso "this", ad esempio:

    codice:
    @Override
    public boolean equals(Object other) 
    {
        if (other == null || other.getClass() != Op.class)
        {
            return false;
        }
    
        if (other == this) 
        {
            return true;
        }
    
        Op op = (Op) other;
        return nome.equals(op.nome);
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Alex riguardo all'equals da mettere in OperaioSpecializzato?

    L'opraio specializzato oltre ad avere lo stesso nome deve avere la stessa specializzazione in termini di (==).
    Come lo faresti?
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da gaten
    Alex riguardo all'equals da mettere in OperaioSpecializzato?

    L'opraio specializzato oltre ad avere lo stesso nome deve avere la stessa specializzazione in termini di (==).
    Come lo faresti?
    Con un AND?

    codice:
    OpSp opSp = (OpSp) other;
    return nome.equals(opSp.nome) && spec == opSp.spec;
    Mi pare manchino un po' le basi...

    ps3: i campi con visiblità di default sono da evitare: mettili private (o protected visto che c'è l'ereditarietà in mezzo...) e metti getter e setter.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Sono tutti private i campi, tranne l'attributo nome(protected) in Operaio, poichè dev'essere ereditato da OperaioSpecializzato.

    Qualora invece il criterio di uguaglianza è legato al fatto che un operaio semplice è uguale ad uno specializzato se hanno lo stesso nome e la specializzazione di quest'ultimo è null, come andrebbero ridefiniti gli equals.

    In questo caso è inevitabile usare il metodo getClass in entrambi gli equals poichè dice che gli operai semplici non sono mai uguali ad operai specializzati. Giusto?
    Con i sogni possiamo conoscere il futuro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.