Il motivo principale per l'utilizzo di classi e interfacce astratte è diverso.
Una classe astratta deve essere utilizzata quando si dispone di classi che hanno implementazioni identiche per un sacco di metodi, ma variano in pochi.
Questo può essere un cattivo esempio, ma l'uso più ovvio di classi astratte nel framework Java è all'interno delle classi java.io. OutputStream
è solo un flusso di byte. Dove va a finire questo flusso dipende interamente dalla sottoclasse di OutputStream
che stai utilizzando ... FileOutputStream
, PipedOutputStream
, lo stream di output creato dal metodo di java.net.Socket
...
Nota: java.io utilizza anche il pattern Decorator per racchiudere stream in altri flussi/lettori/scrittori.
Un'interfaccia dovrebbe essere utilizzata quando si vuole solo garantire che una classe implementa un insieme di metodi, ma non importa come.
L'uso più evidente delle interfacce è all'interno del framework Collections.
Non mi importa come un List
aggiunge/rimuove gli elementi, fino a quando posso chiamare add(something)
e get(0)
mettere e ottenere elementi. Può usare un array (ArrayList
, CopyOnWriteArrayList
), lista collegata (LinkedList
), ecc ...
L'altro vantaggio nell'utilizzo di interfacce è che una classe può realizzare più di uno. LinkedList
è un'implementazione di entrambi List
eDeque
.
Penso che dovresti considerare la composizione anche in questo - che è un concetto importante in termini di riutilizzo - http://www.artima.com/designtechniques/compoinh.html – Jon