class IstruzioneIf extends Istruzione {
  private Variabile var;
  private IstruzioneStampa prima;
  private IstruzioneStampa seconda;

// la variabile e' obbligatoria ma le componenti sono
// modificabili; usiamo i metodi set, in modo tale che i
// controlli vengano fatti una sola volta in questi metodi

  public IstruzioneIf(Variabile v, IstruzioneStampa p, IstruzioneStampa s) {
    this.setVariabile(v);
    this.setPrima(p);
    this.setSeconda(s);
  }

// metodi get

  public Variabile getVariabile() {
    return var;
  }

  public IstruzioneStampa getPrima() {
    return prima;
  }

  public IstruzioneStampa getSeconda() {
    return seconda;
  }

// metodi set; solo il set della variabile richiede il
// controllo

  public void setVariabile(Variabile v) {
    if(v==null)
      throw new RuntimeException("La variabile di una IstruzioneIf non puo' essere null");

    var=v;
  }

  public void setPrima(IstruzioneStampa p) {
    prima=p;
  }

  public void setSeconda(IstruzioneStampa s) {
    seconda=s;
  }

// toString

  public String toString() {
    return "if("+var+"("+prima+","+seconda+")";
  }

// equals e hashCode; da tenere in considerazione le
// possibili componenti nulle

  public boolean equals(Object o) {
    if(!this.stessaClasse(o))
      return false;

    IstruzioneIf ii=(IstruzioneIf) o;

    if(!this.var.equals(ii))
      return false;

    if((this.prima!=null)&&(!this.prima.equals(ii.prima)))
      return false;
    else if(ii.prima!=null)
      return false;

    if((this.seconda!=null)&&(!this.seconda.equals(ii.seconda)))
      return false;
    else if(ii.seconda!=null)
      return false;

    return true;
  }

  public int hashCode() {
    int s=3;

    s=s*5+var.hashCode();
    s=s*5+((prima==null)?0:prima.hashCode());
    s=s*5+((seconda==null)?0:seconda.hashCode());

    return s;
  }

// clone: tutti e tre gli oggetti sono clonabili
// notare i controlli su e.prima e e.seconda

  public Object clone() {
    IstruzioneIf e=(IstruzioneIf) super.clone();

    e.var=(Variabile) e.var.clone();
    if(e.prima!=null)
      e.prima=(IstruzioneStampa) e.prima.clone();
    if(e.seconda!=null)
      e.seconda=(IstruzioneStampa) e.seconda.clone();

    return e;
  }

}

