package linguaggio;

// questa e' una classe concreta (non astratta) che estende
// Istruzione; contiene soltanto una stringa, che e' quella
// che va stampata quando questa istruzione verra' eseguita

// notare ancora singolare+maiuscola nel nome, e che non
// serve implements Cloneable perche' il problema
// dell'eccezione e' risolto nella sovraclasse

public class IstruzioneStampa extends Istruzione {
  private String str;

// non accettiamo null come stringa: per non stampare nulla
// si puo' usare la stringa vuota

  public IstruzioneStampa(String s) {
    if(s==null)
      throw new RuntimeException("Tentativo di creazione di istruzione di stampa con stringa nulla");
    str=s;
  }

  public String getStr() {
    return str;
  }

// metodo set: accettiamo che si possa cambiare la stringa
// da stampare, ma non accettiamo la stringa vuota

  public void setStr(String s) {
    if(s==null)
      throw new RuntimeException("Tentativo di inserire null in una istruzione di stampa");
    str=s;
  }

// il metodo toString

  public String toString() {
    return "stampa("+str+")";
  }

// anche equals e' quello standard; il fatto che la
// componente sia privata E che i metodi di creazione e
// modifica impediscano di inserire null nelle componenti ci
// permette di non fare questo controllo

  public boolean equals(Object o) {
    if(o==null)
      return false;

    if(o.getClass()!=this.getClass())
      return false;

    IstruzioneStampa i;
    i=(IstruzioneStampa) o;

    return this.str.equals(i.str);
  }

// quando si ridefinisce equals, e' necessario ridefinire
// anche hashCode

  public int hashCode() {
    return str.hashCode();
  }

// il metodo clone qui non serve perche' il problema del
// protected e dell'eccezione e' risolto nella classe
// astratta, e ridefinire qui il metodo non serve dato che
// la clonazione profonda coincide con quella astratta dato
// che l'unica componente della classe e' una stringa e
// quindi non e' clonabile

}

