Originariamente inviato da valia
vieni da programmazione procedurale??
Quante volte hai visto negli header solo il prototipo della funzione e poi lo hai implementato in altri file? Questa è una prima forma di definizione di interfaccia: una dichiarazione di intenti. Tu dichiari cosa fa il metodo, non come lo fa.
Pensa alla classe ArrayList: implementa list che a sua volta estende Collection. Tu sai che la tua lista deve consentirti add, remove, bene lo dichiari nell'interfaccia. Volendo runtime tu puoi fare una roba del genere
codice:
List lista = new Arraylist();
List lis = new MyArrayList();
e puoi usare questi due oggetti come useresti un oggetto List (quindi su questi fai add, remove ecc) ma non ti frega niente dell'implementazione che usi, perché cmq sai che quelle operazioni le puoi fare. Questa è già una bella potenza, ma come ti dicevo non salta subito all'occhio se non ti trovi a lavorare su ste cose.
L'utilità in piccolo: tu pensa a sviluppare un programma di grosse dimensioni, devi fare un piano (scritto) di cosa farai, delle funzioni che ti servono ecc. Ma il piano ad alto livello come lo fai? interfacce (o qualcosa che somiglia): dici a grandi linee cosa fare, sarà poi l'utente a farlo.
Per quanto riguarda l'ereditarietà multipla: non mi viene un esempio pratico, non ricordo manco dove ho buttato gli appunti.
Mi viene da pensare ad una roba che ho fatto:
componente JXDatePicker (per la data). Volevo farne una mia versione (l'ho inserito in un pannello che avesse anche altre proprietà), ma volevo che fosse anche validabile secondo le mie regole.
Quindi ho la classe Validatore (che impone le regole di validazione), il mio componente e visto che in java
codice:
class MyDatePicker extends JXDatePicker, Validator
è vietato ci ho girato intorno dicendo che Validator è un'interfaccia.
codice:
class MyDatePicker extends JXDatePicker implements Validator, Cloneable
e ci ho aggiunto Cloneable per farti capire che di interfacce puoi metterne quante vuoi.
Tu dici ma in quel modo devo implementarmi il metodo. Nel 90% dei casi l'ereditarietà equivale ad override di qualche metodo. Se scrivi bene la struttura, ti troveresti cmq a fare solo l'override di quel metodo, che differenza c'è a quel punto per te implementarlo o farne l'override?
Se vuoi cmq una versione di default crea la tua classe implementazione default che userai nei casi in cui l'ereditarietà multipla non serve.
In progetti di piccole dimensioni cmq è difficile vedere queste cose