D4rkAng3l
18-05-2009, 12:38
mmm,
stò studiando le astrazioni polimorfiche in Java ma purtroppo mi sono accorto che quelle due pagine di appunti sono più o meno incomprensibili anche per me che le ho scritte perchè ho scritto un casino...quello che sono riuscito a decriptare dalla mia calligrafia è questo...
Praticamente si vuole realizzare un algoritmo di ordinamento su array e si vuole che tale algoritmo funzioni per ogni tipo di dato.
Per fare ciò viene definito un nuovo tipo di dato Confrontabile mediante un'interface che rappresenta appunto tipi confrontabili (così l'algoritmo funzionerà allo stesso modo su un array di interi così come su un array di double, etcetc)
Quindi:
public interface Confrontabile(){
public boolean minoreDi(Confrontabile);
}
Poi alla pagina dopo trovo questo codice che dovrebbe essere il codice del metodo di ordinamento in loco, che però non c'è scritto il nome del metodo ne in quale classe deve essere messo :muro: :muro: :muro: :muro: :cry: :cry: :cry:
public static void(Confrontabile[] x){ // METODO DI ORDINAMENTO ?!?!
Confrontabile c; // Dichiaro una variabile c di tipo Confrontabile (tipo generico per confrontare tutte le implementazioni di Confrontabile?)
int i,j,n; // Dichiaro 3 variabili intere che uso come indici e contatori
for(i=0; i<x.length; i++){ // Scorri l'array x di tipo Confrontabile dal primo all'ultimo elemento
c = x[i]; // E ad ogni iterazione metti in c il riferimento all'i-esimo oggetto presente nell'array
for(j=i+1; j<x.length; j++){ // Ciclo interno che scorre l'array x a partire dall'(i+1)-esimo elemento
if(x[j].minoreDi[c]{ // Se l'(i+1)-esimo elemento dell'array è minore del precedente puntato da c
c = x[j]; // Metti in c il riferimento all'(i+1)-esimo elemento
n = j; // Metti in n l'indice dell'(i+1)-esimo elemento
}
x[n] = x[i]; // Scambia in loco il valore contenuto nell'i-esimo elemento e mettilo alla posizione (i+1)-esima
x[i] = c; // Scambia in loco e metti il riferimento al vecchio (i+1)-esimo elemento in posizione i
}
} // Così alla fine l'array di Confrontabili è stato ordinato in loco a prescindere da qual'è il tipo effettivo di x
Ed infine ho la definizione del tipo IntConfrontabile che implementa l'interfaccia e contiene l'implementazione del metodo minoreDi() per confrontare tra loro gli elementi di un array di interi (poi ad esempio potrei implementare altri tipi di dato come StringConfrontabile che a sua volta conterà la relativa implementazione di minoreDi() per confrontare le stringhe in base a qualche criterio)
/* Ha delle funzionalità in più rispetto ad Integer: le funzionalità dell'interface */
public class IntConfrontabili extends Integer implements Confrontabile{
/* REQUIRES: y deve essere di tipo IntConf */
public boolean minoreDi(Confrontabile y){
boolean b = false;
if(intValue() < ((IntConf).intValue())
b = true
return b;
}
}
Il ragionamento l'ho capito: dichiaro un tipo di dato Confrontabile il più generico possibile mediante un'interface che contiene un metodo minoreDi(), poi implemento l'interface per ogni sottotipo di array confrontabili tra di loro ed in tali implementazioni ci caccio dentro il codice del metodo che sa confrontare gli elementi di un array omogeneo per quel tipo di collezione.
Nell'algoritmo di ordinamento opero sul tipo generico Confrontabile e verrà richiamato il codice del metodo corretto...ok...ma in pratica da questi appunti non sò come metere insieme il tutto:
1) L'algoritmo di ordinamento in che classe dovrebbe stare? e che nome dovrebbe avere? booo
2) In IntConfrontabile chi cavolo è intValue() ?
3) Confrontabile è solo un'interface e non ha rappresentazione, allora in IntConfrontabile non ci dovrebbe essere anche un array di istanza di tipo int ed il relativo costruttore?
4) Perchè oltre ad implementare Confrontabile gli fa estendere Integer?
Per favore aiutatemi che stò un po' disperato....
Grazie
Andrea
stò studiando le astrazioni polimorfiche in Java ma purtroppo mi sono accorto che quelle due pagine di appunti sono più o meno incomprensibili anche per me che le ho scritte perchè ho scritto un casino...quello che sono riuscito a decriptare dalla mia calligrafia è questo...
Praticamente si vuole realizzare un algoritmo di ordinamento su array e si vuole che tale algoritmo funzioni per ogni tipo di dato.
Per fare ciò viene definito un nuovo tipo di dato Confrontabile mediante un'interface che rappresenta appunto tipi confrontabili (così l'algoritmo funzionerà allo stesso modo su un array di interi così come su un array di double, etcetc)
Quindi:
public interface Confrontabile(){
public boolean minoreDi(Confrontabile);
}
Poi alla pagina dopo trovo questo codice che dovrebbe essere il codice del metodo di ordinamento in loco, che però non c'è scritto il nome del metodo ne in quale classe deve essere messo :muro: :muro: :muro: :muro: :cry: :cry: :cry:
public static void(Confrontabile[] x){ // METODO DI ORDINAMENTO ?!?!
Confrontabile c; // Dichiaro una variabile c di tipo Confrontabile (tipo generico per confrontare tutte le implementazioni di Confrontabile?)
int i,j,n; // Dichiaro 3 variabili intere che uso come indici e contatori
for(i=0; i<x.length; i++){ // Scorri l'array x di tipo Confrontabile dal primo all'ultimo elemento
c = x[i]; // E ad ogni iterazione metti in c il riferimento all'i-esimo oggetto presente nell'array
for(j=i+1; j<x.length; j++){ // Ciclo interno che scorre l'array x a partire dall'(i+1)-esimo elemento
if(x[j].minoreDi[c]{ // Se l'(i+1)-esimo elemento dell'array è minore del precedente puntato da c
c = x[j]; // Metti in c il riferimento all'(i+1)-esimo elemento
n = j; // Metti in n l'indice dell'(i+1)-esimo elemento
}
x[n] = x[i]; // Scambia in loco il valore contenuto nell'i-esimo elemento e mettilo alla posizione (i+1)-esima
x[i] = c; // Scambia in loco e metti il riferimento al vecchio (i+1)-esimo elemento in posizione i
}
} // Così alla fine l'array di Confrontabili è stato ordinato in loco a prescindere da qual'è il tipo effettivo di x
Ed infine ho la definizione del tipo IntConfrontabile che implementa l'interfaccia e contiene l'implementazione del metodo minoreDi() per confrontare tra loro gli elementi di un array di interi (poi ad esempio potrei implementare altri tipi di dato come StringConfrontabile che a sua volta conterà la relativa implementazione di minoreDi() per confrontare le stringhe in base a qualche criterio)
/* Ha delle funzionalità in più rispetto ad Integer: le funzionalità dell'interface */
public class IntConfrontabili extends Integer implements Confrontabile{
/* REQUIRES: y deve essere di tipo IntConf */
public boolean minoreDi(Confrontabile y){
boolean b = false;
if(intValue() < ((IntConf).intValue())
b = true
return b;
}
}
Il ragionamento l'ho capito: dichiaro un tipo di dato Confrontabile il più generico possibile mediante un'interface che contiene un metodo minoreDi(), poi implemento l'interface per ogni sottotipo di array confrontabili tra di loro ed in tali implementazioni ci caccio dentro il codice del metodo che sa confrontare gli elementi di un array omogeneo per quel tipo di collezione.
Nell'algoritmo di ordinamento opero sul tipo generico Confrontabile e verrà richiamato il codice del metodo corretto...ok...ma in pratica da questi appunti non sò come metere insieme il tutto:
1) L'algoritmo di ordinamento in che classe dovrebbe stare? e che nome dovrebbe avere? booo
2) In IntConfrontabile chi cavolo è intValue() ?
3) Confrontabile è solo un'interface e non ha rappresentazione, allora in IntConfrontabile non ci dovrebbe essere anche un array di istanza di tipo int ed il relativo costruttore?
4) Perchè oltre ad implementare Confrontabile gli fa estendere Integer?
Per favore aiutatemi che stò un po' disperato....
Grazie
Andrea