Esercizio 3
Un trapano verticale si può muovere lungo le direzioni x,y di un piano per poi fermarsi ed eseguire un foro.
L'operazione di foratura e di traslazione lungo gli assi xy è subordinata al fatto che il motore del trapano sia acceso o spento.
Realizza una classe 'Motore' che gestisca lo spegnimento e l'accensione del motore.
Estendi la classe precedente con la classe 'Punta' che invece si occupa di muovere il trapano sui tre assi.
class provaTrapano {
public static void main (String args []) throws IOException{
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);
String s;
char ch;
int dx,dy;
Punta p=new Punta();
do{
System.out.print("a)ccendi s)pegni m)muovi f)ora e)esci:");
s=(h.readLine()).toLowerCase();
ch = s.charAt(0);
switch (ch) {
case 'a':
System.out.println("motore acceso.");p.on();break;
case 's':
System.out.println("motore spento.");p.off();break;
case 'e':System.out.println("Exit");break;
case 'f':p.fora();break;
case 'm':
if(!p.status())
System.out.println("mot.spento 'a' per accendere");
else{ System.out.print("Delta-x:");
dx=Integer.parseInt(h.readLine().trim());
System.out.print("Delta-y:");
dy=Integer.parseInt(h.readLine().trim());
p.muovi(dx,dy); }
break;
default: System.out.println("selezione non valida");
}//fine switch
if(ch=='e' && p.status()==true)
System.out.println("spegnere il motore.");
}while(!(p.status()==false && ch=='e'));
}//fine main
}// fine classe provaTrapano
class Motore{
private boolean x;//attributo
Motore(){ x=false;}//costruttore
public void on(){ x=true;}//metodo
public void off(){ x=false;}//metodo
public boolean status(){return x;}//metodo
}//fine classe Motore
class Punta extends Motore{
private int x,y;
Punta(){x=y=0;}
public void muovi(int dx,int dy){
System.out.print("muove:");
azione(Math.max(Math.abs(dx),Math.abs(dy)));
x=x+dx;y=y+dy;
System.out.println("\nfermo a x="+x+" y="+y);
}//fine metodo muovi
public void fora(){
if(!status())
System.out.println("motore spento premi 'a' per accendere");
else { System.out.print("fora:");
azione(5);
System.out.println("\nfermo a x="+x+" y="+y);
}//fine else
}//fine metodo fora
private void azione(int delay){
for(int i=0;i < delay;i++){
try {
Thread.sleep(500);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}//fine try-catch
System.out.print("*");
}//fine for
}//fine metodo azione
}//fine classe Punta
che serve esclusivamente per introdurre nell'esecuzione un ritardo
di 500ms è contenuto nel metodo azione(int delay) che serve solo
per rappresentare l'intervallo di tempo durante il quale avvengono
le operazioni di traslazione e foratura della punta.
Come si vede anche in questo esempio di ereditarietà, il programma principale,
dopo aver istanziato un oggetto p di classe Punta,
può usare indifferentemente i metodi della classe Punta
e della classe Motore che sono stati ereditati. Si
nota, inoltre, la routine:
Thread.sleep(500);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}//fine try-catch