PDA

Visualizza versione completa : [JAVA] Interfacce e classi con metodi vuoti.


Samaritan
21-07-2009, 00.56.44
Salve a tutti, vorrei chiedervi qual'è la sostanziale differenza tra l'implementazione di una interfaccia che dichiara N metodi e la derivazione di una classe concreta che definisce gli stessi N metodi con la stessa firma, ma con il corpo vuoto.
Alla fine la classe definisce comunque un tipo e questo ne permette quindi la derivazione da parte di altre classi ciascuna che implementa quei metodi vuoti a modo proprio facendone quindi un override.
Questo permette quindi anche l'utilizzo del polimorfismo e del binding dinamico di java, visto che si può utilizzare come supertipo la nostra classe con i metodi vuoti e poi ci penserà la jvm ad invocare le diverse implementazioni di quei metodi vuoti in base alla reale istanza di sottoclasse assegnata ad una reference di quel supertipo.
Capisco che utilizzando un'interfaccia si adotta la soluzione più corretta e più elegante, ma da un punto di vista pratico che differenza c'è oltre al fatto che ovviamente utilizzando una superclasse con metodi vuoti questa può essere direttamente istanziata poichè concreta, mentre lo stesso non si può fare con un tipo definito da una interfaccia che ha tra i suoi scopi principali anche quello di impedire la istanziazione di un tipo che non deve essere istanziato perchè ancora non implementato.
Ovviamente escludendo il fatto che tramite le interfacce si supera il limite della ereditarietà singola di java.
Tra l'altro il metodo della superclasse con metodi vuoti viene anche utilizzato in un paio di design pattern dei GOF, non mi ricordo se nel builder o nel decorator.
:mm:

P8257 WebMaster
27-08-2009, 15.22.50
Ciao,
La differenza tra interfacce e classi stub può sfuggire e generare a volte ambiguità in ragione del fatto che a volte non si considera lo scopo primo per cui esistono e possono esseere utilizzate.

Le interfacce sono in primo luogo uno strumento di "uniformazione" ovvero permettono al programmatore di stabilire il formalismo con il quale un oggetto (un tipo) debba essere definito ed implementato e NON hanno scopo direttivo né implementativo; in pratica l'interfaccia è uno strumento con cui il programmatore dice (a se stesso o a chi implementerà l'interfaccia) che per interagire con certe parti del programma occorre uno o n oggetti con queste caratteristiche ma senza scendere nella natura implementativa di tali caratteristiche. Chi implementa l'interfaccia può essere anche un programmatore che non sa nulla né del programma e né del suo funzionamento intrinseco e se l'interfaccia in se è ben definita, non è tenuto a saperne oltre, sarà poi l'utilizzatore (chi ha scritto l'interfaccia) a dover fruire al meglio dell'oggetto implementato.
L'uso delle interfacce inoltre risolve i problemi di ereditarietà multipla che hai giustamente evidenziato nel post, cosa non da poco e non bypassabile nel caso di classi stub.

La classe stub è una classe vuota che implementa un supertipo solo formalmente ma non conosce le logiche di funzionamento del tipo ed è usata come base per ereditare in situazioni di polimorfismo, questo concetto è lontano dal concetto di interfaccia in quanto, che la classe sia vuota o meno, hai comunque creato una struttura di codice eseguibile ed effettuando l'override vai a creare una ridondanza concettuale nella stesura del programma implementando in modo ridondante le stesse identiche strutture oltre al fatto di doverle allocare 'n' volte quante sono le implementazioni dato che potresti riferirti al "supertipo" vuoto o al "supertipo" implementato in modo assolutamente dinamico.
In questo caso quindi meglio utilizzare le classi astratte nel polimorfismo dove puoi implementare un supertipo e 'n' metodi astratti da scrivere e reimplementare facendo scegliere a run-time il binding in maniera polimorfica.

Spero di essere stato esauriente

LoryOne
27-08-2009, 21.02.07
Porca miseria, chi si rilegge, ma dov'eri finito ?
Welcome back web.
Adesso che il web is back possiamo far one step forward.

Semi.genius
27-08-2009, 21.04.08
Però il thread era di un mese fa! :p

LoryOne
27-08-2009, 21.08.11
38 steps forward, allora :D

Semi.genius
27-08-2009, 21.08.59
38 steps forward, allora :D

è John Titor!!! :x:

LoryOne
27-08-2009, 21.12.17
Eh gia...ma allora la domanda è: dov'è finito Giacobbo ?

P8257 WebMaster
28-08-2009, 09.05.00
Ciao ragazzi .. ;)
mi fa piacere tornare in questo forum e rivedere vecchi amici come Lory, ho latitato per un annetto buono :D ma non ho mai perso di vista la scia di byte :D

Semi.genius
28-08-2009, 12.39.18
Ciao ragazzi .. ;)
mi fa piacere tornare in questo forum e rivedere vecchi amici come Lory, ho latitato per un annetto buono :D ma non ho mai perso di vista la scia di byte :D



Ho letto che sei programmatore C# ... puoi attivare i pm per un giorno che te ne vorrei inviare uno a riguardo? :p

P8257 WebMaster
28-08-2009, 13.36.47
Scrivi qui, almeno possiamo confrontarci con altre persone altrettanto valide e poi così la discussione rimane anche per altri

Semi.genius
28-08-2009, 13.55.34
Scrivi qui, almeno possiamo confrontarci con altre persone altrettanto valide e poi così la discussione rimane anche per altri

Ehm, veramente era "propaganda" del progetto Cosmos, non un dubbio e vado contro regolamento se scrivo qui... :p