Newsgroup: it.comp.java
Titolo: utilizzo delle variabili reference per classi...

Ciao a tutti, non riesco a capire una cosa: se io ho una classe derivata
posso referenziarne una sua istanza con una variabile del tipo della classe
madre: ok, ma questo a cosa mi serve, e quali vantaggi mi da?
Non riesco a capirne l'utilitŕ!
Ciao e Grazie mille!

 Non riesco a capirne l'utilità!
immagina di avere un metodo che legge dati da uno Stream..
che senso ha averne uno x file, x socket o x quello che saà?
il tuo metodo accetta in ingresso oggetti Stream, ch sono alla base dello
stream da file e da socket
antonio

 dello stream da file e da socket
Scusami antonio ma... sono un po duro, e soprattutto ho appena iniziato, e
nn ho capito molto...
In questo esempio dove trovo un'istanza di sottoclasse la cui variabile di
referenza č del tipo della superclasse?
Scusami, ma sono i primi passi che sto facendo...
Ma grazie mille per avermi risposto!

 Ma grazie mille per avermi risposto!
Esempio classico,
hai una classe Animale e una classe Cane che estende la classe Animale,
nella classe Cane hai l'attributo animalechestabeneskiacciatosullasfalto che
dovrà essere di classe Animale per poter essere successivamente settato con
un'istanza di classe Gatto (che, ovviamente, estende a sua volta la classe
Animale).
eh ?

 classe Gatto (che, ovviamente, estende a sua volta la classe Animale).
ma se l'attributo animalechestabeneskiacciatosullasfalto (della classe Cane)
è public, può essere settato da chiunque, senza il bisogno di essere di tipo
Animale, o no?
Provo a fare un esempio:
public class Animale{}
public class Vacca extends Animale {}
Animale scrofaDaMonta = new Vacca();
A cosa mi serve avere una scrofaDaMonta di tipo Animale invece che di tipo
Vacca?  Sarebbe bastato fare
Vacca scrofaDaMonta = new Vacca();
e se tutti i metodi e attributi sono public possono essere settati o
utilizzati da qualunque oggetto, o mi sbaglio?


un esempio:
classe padre:  p
classi figlie di p:   f1  e   f2
poniamo che tu scriva un algorimo qualunque che fa qualcosa con un
oggetto istanza della calsse f1 usando i suoi metodi.
quell'algoritmo sarebbe applicabile solo a oggetti istanza della
classe f1 non a oggetti istanze di f2 né di p.
Ma se tu quell'algoritmo lo scrivi per p,
poi potrai passagli oggetti istanze di f1 o f2 o qualunque altra
classe deciderai di scrivere in futuro, la quale erediti da p.
L' oop non finisce quando capisci cosa sono incapsulamento,
ereditarietà, polimorfismo, è li che inizia.
Ciao
Chairam

 Andy Ydna finita la pioggia decise di sentenziare così:
dai su .. lasciamo perdere gli animali...
public class Animale
{
    public boolean mangia(Tipocibo cibo);
};
public class Carnivoro extends Animale
{
    public boolean mangia(Tipocibo cibo)
    {
        if (cibo.tipo() == CARNE) return true;
        return false;
    }
}
public class Vegeteriano extends Animale ...
public class Onnivero ....
// Fattore .. da' da mangiare a tutti gli animali della sua fattoria
// immagina di avere un vettore di animali...
Animale [] animali;
for (int i = 0; i < animali.size??; i++)
    animali[i].mangia(qullochehaidamangiare);
in questo modo dai da mangiare a tutti gli animali della fattoria, in questo
modo dai da mangiare sempre allo stesso modo,
senza fare distinzione se sono onnivori, vegetariani o carnivori..
se loro hanno accettato il cibo, a te non ti interessa sapere cosa si
tratta.. altrimenti cambi il tipo di cibo..
poi se sei dal maiale,e gli hai dato della carne o della frutta... non ti
cambia niente :)
a cosa serve avere una istanza di una sottoclasse referenziato alla
superclasse ? a rendere il + astratto il codice
tu sai che invocando mangia della classe Animale dai da mangiare.. senza che
tu conosca poi come mangierà l'animale (o che cosa
mangierà, il cibo sta lì .. )
antonio

 Animale, o no?
E' public e di classe Animale perchè lo puoi settare con un'istanza di Gatto
o un'istanza di Ornitorinco o un'istanza di Gattofilo (tutte classi che
estendono Animale) a seconda dell'istanza di Cane che hai... Ci sarà il cane
che odia il Gatto, il cane che odia l'Ornitorinco e via dicendo...

 Non riesco a capirne l'utilità!
provo a fare un esempio anch'io. Mettiamo che io voglia scrivere un
algoritmo di ordinamento. Posso scrivere un metodo nella classe Vector, uno
in ArrayList, uno in Stack, uno in LinkedList... oppure uno solo che prenda
una generica AbstractList che poi funzionarà per tutte le strutture di dati
che erediteranno da AbstractList. Quale ti sembra la soluzione piu'
opportuna?
Altro esempio:
mettiamo che stia scrivendo un programma che stampa sullo standard output
tutte le stringhe di una lista passata per argomento.
due possibilità:
public void stampa(Vector v) {} 
o qualunque altra classe concreta
oppure public void stampa (List l) {}
ok, List è una interfaccia ma per quello che voglio dire è la stessa cosa...
cmq se non ti piace mettici una classe AbstractList che implementa List.
Nel primo caso obbligo il progettista del client ad usare un Vector. Nel
secondo gli lascio la possibilità di scegliere la struttura che vuole
purché supporti lo operazioni che mi servono. Lui potrebbe preferire
ArrayList perché non gli serve la sicronizzazione o LinkedList... insomma
sono cavoli suoi.
Molto meglio no?
Ciao
Matteo

Grazie mille ragazzi, siete stati davvero tutti gentilissimi a dedicarmi il
vostro tempo per aiutarmi, e adesso, grazie a voi, ho capito!!!! Grazie di
tutti gli esempi che mi avete fatto, sono stati tutti utilissimi per capire
questa cosa!
Grazie della vostra disponibilità...
Ciao!!!