// questa classe deve essere astratta (vedi Leggimi.txt)

// si deve implementare Cloneable e ridefinire clone perche'
// altrimenti non sarebbe possibile clonare una istruzione
// "generica"; in altre parole, non sarebbe possibile
// scrivere:
//
// Istruzione i;
// ...
// Istruzione j=(Istruzione) i.clone();
//

abstract class Istruzione {

// le sottoclassi non hanno componenti o metodi comuni (a
// parte quelli di Object), per cui questa classe non e'
// tenuta ad avere ne' componenti ne' metodi, a parte clone

// realizziamo un metodo privato che puo' essere utile a
// tutte le sottoclassi; notare che e' un errore chiamarlo
// "equals", dato che fa solo il confronto fra classi e
// quindi non e' un vero metodo equals

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

    return this.getClass()==o.getClass();
  }

// clone e' necessario perche' un generico oggetto
// Istruzione deve essere clonabile

  public Object clone() {
    try {
      return super.clone();
    }
    catch(CloneNotSupportedException e) {
      return null;
    }
  }

}

