edutecnica

Esercizio 2        

Crea un programma per calcolare il perimetro di due tipi di triangolo: isoscele e scaleno. Le due classi I (isoscele) e S (scaleno) devono essere derivate da una superclasse T che contiene il metodo di validazione isT(..) che stabilisce se il triangolo esiste ed il metodo peri(..) per il calcolo del perimetro.


Ricordiamo che un triangolo esiste solo se la lunghezza di ogni lato è inferiore alla somma degli altri due lati.
Possono essere valutati solo triangoli scaleni (S) ed isosceli (I). Una volta istanziato un oggetto di classe S o di classe I se il triangolo esiste viene restituito il perimetro. Se il triangolo non esiste, viene restituito 0 .

class provaTriangoli{
public static void main (String args []) {
S s=new S(2,1,3);//scaleno
I i=new I(3,4);//isoscele lati=3,3,4
System.out.println(s.getS());
System.out.println(i.getI());
}//fine main
}// fine classe
class T{
protected boolean isT(int x,int y,int z) {
  if (((x+y)>z) && ((x+z)>y) && ((y+z)>x))return true;
  else return false;
}
protected int peri(int h,int k,int w){return h+k+w;}
}//fine classe T

class S extends T {//scaleno
private int a,b,c,p;
S(int A,int B,int C){//costruttore
  a=A;b=B;c=C;
  if(isT(a,b,c)==true)p=peri(a,b,c);
  else p=0;
}//fine costruttore
public int getS() {return p;}
}//fine classe S

class I extends T {//scaleno
private int a,b,p;
I(int A,int B){//costruttore
  a=A;b=B;
  if(isT(a,a,b)==true)p=peri(a,a,b);
  else p=0;
}//fine costruttore
public int getI() {return p;}
}//fine classe I

L'output di questo listato sarà:
0
10

questo perché il primo triangolo (quello scaleno) non esiste.
Si nota come i costruttori di S ed I facciano uso dei metodi ereditati. L'uso:
protected boolean isT(int x,int y,int z)
protected int peri(int h,int k,int w)

della clausola protected, permette solo alle due sottoclassi di fare uso dei due metodi.
Le due classi S ed I possono essere compendiate in un unica classe SI utilizzando uno dei meccanismi del polimorfismo: l'overload di metodi, lo stesso nome per un metodo rappresenta elaborazioni differenti dichiarate in sottoclassi e quindi durante l'esecuzione del programma, in oggetti diversi.
Metodi contenuti in diverse classi della gerarchia possono avere lo stesso identificatore, gli stessi parametri di ingresso (per numero e tipo di dato) e restituire un risultato dello stesso tipo di dato, ma possono differire per l'elaborazione eseguita.
Se un metodo di una sottoclasse ridefinisce un metodo con la stessa firma dichiarato nella superclasse si dice che i due metodi sono sovrapposti (overriding).
Se due metodi di una classe restituiscono lo stesso tipo, hanno lo stesso identificatore ma hanno segnatura (dei parametri diversa) si parla di metodi sovraccarichi (overload). Nella seguente rielaborazione del programma precedente i due costruttori della classe SI sono overloaded:

class provaTriangoli{
public static void main (String args []) {
SI s=new SI(2,1,3);//scaleno
SI i=new SI(3,4);//isoscele lati=3,3,4
System.out.println(s.getSI());
System.out.println(i.getSI());
}//fine main
}// fine classe
class T{//classe Triangolo
protected boolean isT(int x,int y,int z) {
  if (((x+y)>z) && ((x+z)>y) && ((y+z)>x))return true;
  else return false;
}
protected int peri(int h,int k,int w){return h+k+w;}
}//fine classe T
class SI extends T {
private int a,b,c,p;
SI(int A,int B,int C){//costruttore scaleno
  a=A;b=B;c=C;
  if(isT(a,b,c)==true)p=peri(a,b,c);
  else p=0;
}//fine costruttore
SI(int A,int B){//costruttore isoscele
a=A;b=B;
if(isT(a,a,b)==true)p=peri(a,a,b);
else p=0;
}//fine costruttore
int getSI() {return p;}
}//fine classe SI

Esistono due costruttori SI(..) uno con 3 parametri in ingresso per il triangolo scaleno e uno con 2 parametri per il triangolo isoscele, quindi con diversa segnatura. Il programma eseguirà il metodo invocato da una chiamata con i parametri corrispondenti:questo è un esempio di overload di metodi.