Quando leggevo e guardavo i codici usando le classi astratte, ero in grado di giustificarlo perché ti permette di aggiungere metodi comuni per qualsiasi sottoclasse che estende la classe astratta. Quindi, per esempio, se il comportamento degli oggetti è simile, userei le classi Abstract per implementare metodi astratti senza corpo che sono richiesti per ogni oggetto, e semplicemente usare metodi non astratti già implementati nella classe astratta. Posso pensare a uno scenario che si occupa di più tipi di file multimediali (avi, mpg, mp4) e avresti metodi comuni per tutti i file, oltre a metodi astratti specifici dei media che devono essere implementati.
Tuttavia, sono un po 'confuso sul motivo per cui si dovrebbe creare consapevolmente un'interfaccia che non può contenere metodi non astratti. Leggendo questa pagina , si afferma che nasconde informazioni (intendi i metodi astratti?).
Hiding details and providing common interfaces is called encapsulation, which is an analogy from making an object look like it's covered by a capsule (the interface in this case). This allows two objects differing in internal representation but having the common interface interchangeably usable (called interchangeability). Interfaces also allow to facilitate the use of data structure and guard the state of the object from invalid inputs and modification of the structure.
Quindi questo significa che qualsiasi oggetto che condivide i comportamenti comuni implementati in modo univoco può essere trattato come se fossero la stessa categoria? Quindi, per l'esempio del file multimediale, vuol dire che qualsiasi tipo di file multimediale specifico che implementa interface MediaFile
deve essere passato come argomento per un metodo che riguarda questo tipo di oggetti?
public class ServiceClass {
public ServiceClass(){
//no-args constructor
}
public boolean runService(ICollaborator collaborator){
if("success".equals(collaborator.executeJob())){
return true;
}
else
{
return false;
}
}
}
Ma non puoi fare sopra con una classe astratta? Inoltre, non è la capacità di avere un metodo non astratto meglio di non averne affatto per il futuro quando improvvisamente hai bisogno di un metodo esistente che si applichi a tutte le classi che estendono la classe astratta?
O la differenza nell'uso di Interface, la capacità di proteggere completamente l'implementazione dei dati? Ancora una volta, non vedo in quali casi lo useresti. Oltre a questo, implemento spesso ActionListener
quiet per avere il metodo actionPerformed
.