Newsgroup: it.comp.java
Titolo: Abstaract & Interface ??????????

Salve a tutti, quello che sto per chiedere andrebbe punito con crocifissione
in sala mensa, ma lo chiedo comunque.
Avrete già capito che i miei dubbi sono su : CLASSI ASTRATTE e INTERFACCE.
In linea di massima ho compreso il perchè di questi strumenti, ma visto che
la loro logica non è ancora ben chiara, tendo a confonderli.
Il mio dramma, soprattutto è che non avendoli ben chiari i concetti su cui
si basano, non riesco ad utilizzarli.
C'è qualcuno che può darmi qualche delucidazione o che ha degli esempi scemi
sui quali studiare?
Ogni nozione o codice è ben gradito.
Grazie a tutti.

 virtuali pure del C++?
 
Immagino tu abbia gia' chiaro che le interfacce sono un set di metodi dotati di 
un nome.
 
Dal punto di vista del design, le interfacce sono lo strumento per implementare 
un "ruolo" nel sistema, che puo' essere assunto da qualunque classe si 
sobbarchi l'onere di farlo (e abbiano i requisiti per farlo). Sobbarcarsi 
l'onere significa dichiarare "implements", e avere i requisiti significa 
possedere i metodi dell'interfaccia.
 
Una classe astratta e'... una classe astratta :) : qualcosa che, sia dal punto 
di vista concettuale, sia da quello del linguaggio, e' una semi-implementazione 
che va specializzata, ma che comunque contiene certe assunzioni e meccanismi in 
nuce. Usarla, alla C++, per denotare un ruolo (una classe astratta con tutti 
metodi puri) e' una forzatura - rispetto allo stesso concetto di "classe". 
Oltre ad avere dei problemi di comprensibilita' (quando una classe e' 
completamente pura perche' e' un'interfaccia, quando perche' e' solo pura?) e a 
livello di linguaggio - e se hai mai provato ad usare STL insieme a classi 
derivate, ti sarai reso conto che scocciature si hanno per riuscire a usare 
anche solo una semplice list<BaseClass> se BaseClass e' astratta. ;-)
 
Java separa nettamente le due cose: l'ereditarieta' e' singola (una classe *e'* 
un qualcosa ben specifico - e solo quello), ma una classe puo' implementare 
tutte le interfacce che vuole (assumendo quindi tutti i ruoli necessari). Per 
fare una metafora.. umanistica, e' come dire: Tizio _e'_ un essere umano, ma di 
volta in volta _puo' fare_ il vigile urbano, il guidatore d'auto, il papa', 
etc. In base alla mia esperienza, il design per ruoli e classificazione (invece 
che per classificazione e basta) e' estremamente piu' efficace - soprattutto in 
the large - di quello OO 'classico', ed e' poi il filo rosso che sta dietro 
all'idea stessa di pattern di design.
E' uno strumento molto efficace per indicare *attivamente* all'utilizzatore di 
un certo codice _che cosa si intende_ per un certo elemento del proprio design 
- e far si' che il compilatore sia in grado di verificarne l'uso corretto.
 
Dal punto di vista del linguaggio, il trucco sta nel fatto che un nome di 
interfaccia costituisce *un nome di tipo* a tutti gli effetti: puo' essere 
usato in ogni situazione dove puo' essere usato un nome di tipo. Quindi, ad 
esempio, e' legale assegnare ad un riferimento il cui tipo e' un'interfaccia un 
oggetto la cui classe implementa quell'interfaccia. In altri termini e' legale 
scrivere
 
VigileUrbano vigile = tizio;
 
o passare 'tizio' ad un metodo dichiarato
 
public void assegnaControlloreDelTraffico(VigileUrbano vigile);
 
Come ricorderai, in C++ questo tipo di rapporto si ha solo tra puntatori (o 
riferimenti) di classi base a classi derivate (puoi scrivere Base& b=*new 
Derivata per esempio) - cose che ovviamente resta anche in java. 
 
Ora resta chiaro che in quanto a potere espressivo finale le due cose sono 
equivalenti (in C++, per esempio, se fai una list < auto_ptr<Base> > e un bel 
po' d'attenzione riesci a cavartela) ma la leggibilita' e la qualita' generale 
dell'implementazione (che consente di traslare direttamente in linguaggio un 
costrutto di design, facendosi quindi aiutare dal compilatore) ne ottiene 
parecchi vantaggi.
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun

 ha scritto nel messaggio
news:91q3if$31em$1...@stargate1.inet.it...
