|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[JAVA] Realizzare astrazioni polimorfiche, help me per capire quello che dice la prof
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: Codice:
public interface Confrontabile(){
public boolean minoreDi(Confrontabile);
}
Codice:
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
Codice:
/* 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;
}
}
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 |
|
|
|
|
|
#2 | |||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
L'algoritmo farà i confronti tra due elementi dell'insieme dei valori da ordinare considerandoli come oggetti Confrontabili. IntConfrontabile estende java.lang.Integer: intValue() è un metodo ereditato dalla superclasse. Comunque in questo spezzone di codice postato forse c'è un errore, penso si intendesse fare questo: Codice:
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())
if(intValue() < ((IntConfrontabili)y).intValue())
b = true
return b;
}
}
Quote:
Il vostro IntConfrontabile non è altro che un Integer che in più soddisfa il contratto definito dalla vostra interfaccia Comparabili. Quote:
Esempio: Codice:
final int QUANTITY = 10;
IntComparabile[] numbers = new IntComparabile[QUANTITY];
for (int i = 0; i < QUANTITY; i++)
{
numbers[i] = new IntComparabile(i);
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-05-2009 alle 14:36. |
|||
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
PROBLEMI PROBLEMI PROBLEMI ED ANCORA PROBLEMIII !!!
Bene,
inizio a farmi girare le palline perchè si vabbè che avevo preso malegli appunti io ma temo che anche quello che è stato detto in classe sia concettualmente errato almeno in parte... Allora ho realizzato le seguenti 3 classi, che credo ora siano OK: 1) Confrontabile: Codice:
public interface Confrontabile{
public boolean minoreDi(Confrontabile x);
}
Codice:
public class IntConfrontabile extends Integer implements Confrontabile{
/* REQUIRES: y deve essere di tipo IntConf */
public boolean minoreDi(Confrontabile y){
boolean b = false;
// --> if(intValue() < ((IntConf).intValue())
if(intValue() < ((IntConfrontabile)y).intValue())
b = true;
return b;
}
}
Codice:
public class utility{
public static void ordina(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
}
}
C:\Programmi\Crimson Editor\template\esercizi\AstrazioniPolimorfiche>javac IntConfrontabile.java IntConfrontabile.java:1: cannot inherit from final java.lang.Integer public class IntConfrontabile extends Integer implements Confrontabile{ ^ IntConfrontabile.java:1: cannot find symbol symbol : constructor Integer() location: class java.lang.Integer public class IntConfrontabile extends Integer implements Confrontabile{ ^ 2 errors Da quello che ho capito Integer è dichiarato come final e non posso estendere le classi final...quindi? come fare? Cos'è di preciso una classe dichiarata come final? Grazie Andrea |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
O sì, che lollo che sono; le classi wrapper per i tipi primitivi nel JDK sono final: ergo non le puoi estendere.
Ho dato per scontato che quell'extends Integer si riferisse alla classe java.lang.Integer. Magari non è così e Integer è una classe custom che vie siete definiti (o vi dovete definire) voi/il professore... Il fatto è che nello spezzone di codice postato non si vedono import... Quote:
Se si prova a estendere una classe dichiarata come final, si ottiene l'errore in compilazione che hai già sperimentato. Curiosità: non si può dichiarare una classe final e abstract assieme, perchè l'implementazione di una tale classe non potrà mai essere compiuta/completata. Inoltre dato che una classe final non potrà mai venire estesa, i suoi metodi non possono essere soggetti a override (sono implicitamente final anch'essi).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-05-2009 alle 17:25. |
|
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Avrà preso una svista anche lei
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Implementazione custom stupida e minimale della classe Integer, da usare appunto solo per fini di esempio (alla fine vogliamo solo avere il nostro int primitivo wrappato in un oggetto):
Codice:
public class MyInteger
{
/** il valore di tipo int wrappato */
int value;
public MyInteger(int value) {this.value = value;}
public int getValue() {return value;}
@Override
public int hashCode() {return value;}
@Override
public boolean equals(Object o)
{return o instanceof MyInteger && (value == ((MyInteger)o).getValue());}
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-05-2009 alle 17:47. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:00.




















