PDA

View Full Version : Java...Odinamento generico con interfaccia


pippetto1
22-11-2006, 08:24
Ciao ragazzi, inanzitutto ne approfitto per salutare tutti e farmi conoscere, sono nuovo :)
Vi presento il problemino...
Ho una classe Contenitore con diverse variabili (nome, codice, prezzo...),
ne ho un'altra che estende la prima con l'aggiunta di una variabile (lato),
ne ho poi un'altra ke estende anchessa la prima cn l'aggiunte di due variabili (raggio, altezza).
Questo breve intoppo di ereditarietà l'ho superato senza alcun problemi con il comando extends Contenitore ecc...
Ora, il mio problema è questo:
Ho una classe ElencoContenitore che altro non è che un ArrayLista<Object> al cui interno metto tutti i diversi contenitori. Il metodo che non riesco a implementare è questo:
Devo calcolare il minimo dei contenitori rispetto al nome o al codice di essi. Questa implementazione deve essere riutilizzabile nel caso volessi fare la stessa ricerca sul prezzo, aggiungendo solo una classe per fare questo senza modificare il codice. ;)

Beh io ho pensato ad una interfaccia che poi devo implementare nelle varie classi, ma la cosa nn mi è tanto chiara.
E' per questo che chiedo il vostro aiutone :)
Grazie in inticipo a tutti voi amici, un saluto :D

mad_hhatter
22-11-2006, 11:43
se ho capito bene cosa ti serve forse questa discussione fa al caso tuo:

http://www.hwupgrade.it/forum/showthread.php?t=1334798

pippetto1
22-11-2006, 17:24
Mmmmmmm....Non credo...li si parla di oggetti della stessa classe, mentra a me sono 3 oggetti, di cui 2 estendono il terzo e quanto spiegato nn va bene, poiche io nn conosco il tipo dell'oggetto prima di avergli fatto id dovuto cast...
Che dite?

pippetto1
23-11-2006, 09:41
Nessuno sa dirmi niente? nn ci credo, vi immagino + bravi :rolleyes:

mad_hhatter
23-11-2006, 14:59
se leggi bene in quella discussione vedrai che ci sono costrutti per trattare anche oggetti completamente sconosciuti, o quasi... e comunque basta aggiungere un'interfaccia per far si che tutti gli oggetti abbiano dei metodi obbligatori...

PGI-Bis
23-11-2006, 16:24
Puoi definire un tipo EstrattoreMinimo:

public interface EstrattoreMinimo extends Comparator<Contenitore> {
public Contenitore getMinimo(Collection<Contenitore> data);
}

Dato un ArrayList di oggetti di tipo Contenitore, l'estrazione del minimo diventa:

Contenitore minimo = new EstrattoreNomeMinimo().getMinimo(data);

Supponendo che un Contenitore definisca tre attributi readable prezzo, nome e codice, un esempio di EstrattoreNomeMinimo potrebbe essere:

public class EstrattoreNomeMinimo implements EstrattoreMinimo {
private Collator collator = Collator.getInstance();

public Contenitore getMinimo(Collection<Contenitore> data) {
return Collections.min(data, this);
}

public int compare(Contenitore a, Contenitore b) {
return collator.compare(a.getNome(), b.getNome());
}
}

L'interfaccia EstrattoreMinimo ti serve nel caso in cui tu voglia effettivamente "introdurre la nuova classe e basta" così che tu possa specificare all'atto dell'esecuzione quale concreto EstrattoreMinimo debba essere usato, ad esempio:

public class Main {
public static void main(String[] args) {
ArrayList<Contenitore> data = new ArrayList<Contenitore>();
data.add(new ContenitoreBase("base", 10, 5));
data.add(new ContenitoreRaggio("raggio", 15, 4, 20, 20));
data.add(new ContenitoreLato("lato", 20, 3, 20));
EstrattoreMinimo estrattore = null;
try {
estrattore = (EstrattoreMinimo)Class.forName(args[0]).newInstance();
} catch(Exception ex) {
System.err.println("Errore durante la creazione dell'estrattore minimo");
}
if(estrattore != null) {
Contenitore minimo = estrattore.getMinimo(data);
System.out.println("Il minimo e': " + minimo);
}
}
}