Newsgroup: it.comp.java
Titolo: AIUTO: chiarimenti sulle INTERFACCE.

Sto leggendo un libro sul Java che accenna alle interfacce ma
non è molto chiaro.
Cosa sono, a che servono?
come si dichiarano?
Grazie per il vostro aiuti in anticipo.
Rino.

Per quanto riguarda la dichiarazione:
interface <nome-interfaccia> [extends <interfaccia-genitrice>] {
    tipo nome-variabile = valore;
    tipo-restituito nome-metodo(arg);
}
In una interfaccia viene dichiarata la struttura astratta delle classi che
le implementano. I metodi vengono solo dichiarati, ma non viene scritto il
contenuto, che verrà implementato nella classe che implementa l'interfaccia.
Di per se non è necessario dichiarare una interfaccia tuttavia risulta
pratico perché quando si hanno classi che la implementano si è sicuri che
tali classi hanno almeno i metodi della interfaccia stessa.

come si dichiarano?
Una "interface" si dichiara nella forma:
    interface Nome /* ev. "extends AltraInterfaccia */ {
        // dichiarazione di costanti e metodi
        // NB SOLA dichiarazione, NON implementazione!
    };
A parte le costanti, che sono sostanzialmente cosette
"di comodo", una interfaccia e` sostanzialmente un
insieme di _dichiarazioni di metodi_.
Un "codice cliente" puo` ricevere un riferimento ad
una interfaccia (tipicamente come argomento ad un
costruttore o altro metodo), eventualmente salvarselo
in qualche variabile d'istanza, e _usarlo_ -- chiamare
metodi di quella interfaccia -- *senza* preoccuparsi
minimamente di come quei metodi possano essere
stati "implementati".
Una o piu` classi possono poi asserire la clausola
"implements Nome", e sono allora tenute ad avere
implementazioni di tutti i metodi della interfaccia
Nome; in questi casi, un riferimento a una di queste
classi puo` essere passato dovunque sia richiesto
un riferimento all'interfaccia Nome, tipicamente in
"codice cliente" come appena visto.
La programmazione basata su interfacce e` il piu`
puro e produttivo degli approcci al polimorfismo, e
quindi alla programmazione ad oggetti.  Grazie ad
essa si "disaccoppia" interamente il "codice
cliente", che usa le interfaccie, dal codice che
implementa le interfacce stesse.  I vantaggi (in
termini di "pulizia", manutenibilita`, estensibilita`,
e quindi, alla fin fine, di produttivita` a lungo
termine) sono veramente enormi.
Alex

L'interfaccia è quindi utile anche per definire uno "standard"?
Cioè per imporre l'esistenza (e i relativi nomi) di alcune
funzioni o.... metodi?!? no?

 Rino.
in effetti sono difficili da capire...
anch'io hoperso molto tempo...enon sono convinto di averedel tutto
capito.
si dichiarano cosi' 
public interface nome extends nomesuper {..}
credo che lo scopoprincipale sia quello si superare i problemi insiti
nella ereditarieta' singola delle classi tipica di java.
Comunque ti consiglio di andare nel tutorial di javasoft e
 tirare giu' una spiegazione
http://www.javasoft.com
ciao
-- 
 Enrico
 
ame...@dei.unipd.it
 cell.0338 - 9679308

funzioni o.... metodi?!? no?
Certo!  Purtroppo, a differenza che in Eiffel, non si possono
esprimere anche ("in modo eseguibile") le precondizioni e
postcondizioni dei metodi, ma almeno l'esistenza in termini
di nomi e tipi di argomenti/valori di ritorno, quella si`!  Una
classe che implementa un'interfaccia (se e` classe concreta,
dunque effettivamente istanziabile) deve in particolare avere
una implementazione di tutti i metodi di quell'interfaccia.
Alex

nella ereditarieta' singola delle classi tipica di java.
La eredita`-di-implementazione (che e` quella che in Java
e` singola, e si esprime con il verbo "extends") ha comunque
i problemi suoi -- quella singola ne ha alcuni, quella multipla
ne ha altri, ma "liscia" non e` comunque mai.
La cosa veramente *fondamentale* NON e` "extends": e`
invece proprio "implements" -- quella che definisce la cosa
IMPORTANTE di un oggetto, cioe` *come i clienti possono
usarlo* (==quali interfacce implementa).  Come un oggetto
poi implementi la funzionalita` che i clienti possono usare e`
*secondario* -- la cosa *principale* e` quale SIA la specifica
di questa funzionalita`!
Alex

 funzioni o.... metodi?!? no?
Bingo! :) Dal punto di vista del linguaggio (e del suo sistema di
typechecking) hai centrato in pieno: le interfacce sono *esattamente*
questo.
Dal punto di vista del design, ti permettono di definire un "ruolo"
nel sistema, *indipendentemente* dalla particolare classe che implementera' quel ruolo.
Saluti 
	(un norvegese) Cris