package esprreali;

// Questa classe eredita tutti i metodi non astratti di
// EsrpReale. Quindi, la classe Costante ha automaticamente
// i metodi stessaClasse e clone (che fa una copia
// superficiale). In particolare, il metodo stessaClasse va
// invocato come this.stessaClasse(o), ossia usando this e
// non super.

// Per i nomi delle classi, ci atteniamo alla convenzione
// dei nomi maiuscoli e al singolare: gli oggetti "Costante"
// rappresentano le costanti.

public class Costante extends EsprReale {
  private double valore;

	// anche se non e' specifiato esplicitamente nel testo del
	// problema, e' chiaro che occorre poter scrivere e
	// leggere il valore della costante; la soluzione piu'
	// pulita e' quella di scrivere usando il costruttore e
	// leggere con un metodo get
  public Costante(int v) {
    valore=v;
  }

  public double getValore() {
    return this.valore;
  }

	// il testo del problema specifica che la versione stringa
	// di una costante e' la stringa in cui c'e' solo il
	// valore della costante; scrivere quindi un metodo
	// con un corpo: return "Costante: "+valore; e' un errore
  public String toString() {
    return ""+valore;
  }

	// possiamo usare il metodo ausiliario di confronto
	// delle classi; si poteva anche fare il confronto
	// esplicitamente in questo metodo; in generale, nel
	// metodo equals non va fatto il confronto usando
	// instanceof, perche' (o instanceof Costante)
	// darebbe false in tutte le sottoclassi di
	// Costante, per cui poi il metodo equals andrebbe
	// ridefinito nelle sottoclassi anche se non sono
	// state aggiunte componenti all'oggetto; in
	// generale, a meno che una classe non sia
	// dichiarata final (cosa che non e' prevista dal
	// testo del problema) si deve sempre pensare che si
	// possano dover fare delle sottoclassi
  public boolean equals(Object o) {
    if(!this.stessaClasse(o))
      return false;

    Costante c=(Costante) o;

    return this.valore==c.valore;
  }

	// l'implementazione di hashCode che consiste nella sola
	// istruzione "return 7;" e' di scarso valore; lo stesso
	// vale per le implementazioni che troncano il valore
	// reale a intero (2.1 e 2.8 avrebbero lo stesso
	// hashCode); meglio quindi affidarsi al metodo
	// hashCode previsto per i reali, che si trova nella
	// classe Double
  public int hashCode() {
    Double b=new Double(this.valore);
    return b.hashCode();
  }

	// qui la clonazione superficiale va bene perche'
	// l'oggetto Costante non ha componenti oggetto;
	// possiamo quindi non ridefinire clone() e usare
	// direttamente quello ereditato da EsprReale
}

