PDA

Visualizza la versione completa : [java] interfacce e abstract for dummies


Leandro
09-01-2004, 10:10
Salve a tutti!
Premetto che sto iniziando ora a programmare in java ed ho bisogno di un "piccolo" aiuto.


Problema: :nonlodire

Ho una classe che gestisce tutte le interazioni con un database ed ai metodi di questa classe accedono molte altre classi. Vorrei poter usarne i metodi senza ogni volta dover istanziarne un oggetto.
Mi pare, e sottolineo "pare", che debba definire questa classe come abstract o come interface. Il fatto è che ancora non ho capito la differenza tra i due! Ho letto anche un post in questo forum ma ancora non mi è chiaro. A che serve per esempio definire dei metodi in una interfaccia se poi devo scrivere il codice che li implementa nella classe che la usa?

Grassie per l'attenzione

Popper
09-01-2004, 10:24
Originariamente inviato da Leandro
Ho una classe che gestisce tutte le interazioni con un database ed ai metodi di questa classe accedono molte altre classi. Vorrei poter usarne i metodi senza ogni volta dover istanziarne un oggetto.

I metodi di utilità pubblica, che non richiedo necessariamente un'istanza della classe che li implementa, devono essere dichiarati di tipo static.
Un esempio che calza a pennello è il metodo parseInt della classe Integer. Non ha senso creare ogni volta un'istanza di Integer per parsare una stringa in intero:


// funziona ma e' errato:
Integer unIntero = new Integer(0);
int valoreParsato= unIntero.parseString(stringaValore);

è sufficente richiamare il metodo statico senza fare alcuna new


//cosi' e' corretto
int valoreParsato= Integer.parseString(stringaValore);

:ciauz:

Leandro
09-01-2004, 10:31
Grazie mille... Ho fatto le mie prove e funge (:

Popper
09-01-2004, 10:49
Il fatto è che ancora non ho capito la differenza tra i due! Ho letto anche un post in questo forum ma ancora non mi è chiaro. A che serve per esempio definire dei metodi in una interfaccia se poi devo scrivere il codice che li implementa nella classe che la usa?

Grassie per l'attenzione [/B]
C'è una bella differenza :)
Concettualmente parlado una classe astratta è una definizione INCOMPLETA di un'entità, che non può essere istanziata ex novo perchè non definisce uno o + metodi. Il classico esempio è la Class PoligonoGenerico, che ha il metodo calcolaArea dichiarato come astratto (supponiamo che non esista una funzione generica per calcolare l'area di un poligono con un qualsiasi numero di lati).
L'oggetto Poligono quindi è un'entita' astratta, che non potrà mai esistere. Potranno altesì essere istanziate le sue sottoclassi Quadrato, Triangolo, Rettangolo ...... , che implementano invece il metodo CalcolaArea.

andrà quindi in errore il codice:


Poligono unPoligono = new Poligono();
//Poligono è astratta!!

Metre funzionerà


Quadrato quadrato = new Quadrato(5);
//o anche
Poligono unPoligono = new Quadrato(5);


L'utilizzo delle interfaccie ci viene incontro quando vogliamo che la nostra classe implementi determinate caratteristiche, indipendentemente dalla struttura gerarchica a cui appartiene.
Supponiamo che i nostri poligoni debbano essere visualizzati su un'area grafica. Sarà sufficente specificare nella dichiarazione della classe che essi implementano la caratteristica Disegnabile, dichiarata come Interfaccia a parte in un file Disegnabile.java, con il seguente metodo vuoto:
PaintPoligono(Graphics g);
Nella


class Quadrato implements Disegnabile

andrà quindi implementato il suddetto metodo!

Tutto questo può servire,ad esempio, ad una classe che voglia visualizzare su schermo un Vector di oggetti "Disegnabile", indipendentemente da cosa essi effettivamente siano: poligoni, finestre o oggetti 3d.

Scusate i nomi schifidi in italiano ma ho cercato di essere + chiaro il possibile ^^!!

Leandro
09-01-2004, 11:15
Già incomincio a vederci più chiaro.

Quindi se ho capito bene un abstract è una classe generica che ha dei metodi comuni a tutte le classi più specifiche che però implementeranno questi metodi a seconda del caso.

public abstract class Poligono{
abstract int calcolaArea();
}

public class Rettangolo extends Poligono{
int calcolaArea(){
A=b*h;
}
}

O no?

Le interfacce mi sono ancora ostiche.
Grazie per l'impegno (:

Popper
09-01-2004, 11:56
ci ho provato! :D
cmq la classe astratta è corretta cosi' come l'hai scritta tu (tranne per il calcolaArea a cui manca la return, cmq np ;) )

Le interfaccie si capiscono col tempo. Tieni a mente che mentre l'ereditarietà (con classi astratte o meno) contretizza il concetto di A è un B o meglio Rettangolo è un Poligono, l'implementazione di interfaccie specifica una o + Caratteristiche della tua classe: Rettangolo è Disegnabile, Serializzabile, Stampabile.

Loading