PDA

Visualizza la versione completa : Java Domanda su classi e eredità


Fausto81
27-01-2003, 09:30
Ho un dubbio...........
Ho due classi :Padre e Figlio
Figlio eredita tutti i metodi da quella padre.

E' possibile fare questo:
Figlio p = new Padre();

Cioè instanziare solo la classe che Padre.......da quella figlia(e soprattutto cosa mi serve?)

Ps: Sono un po' digiuno di programmazione ad oggetti.........

Help Me.........

Popper
27-01-2003, 10:20
hmmm si credo si possa fare ma non ti serve a + di tanto... di solito si fa il contrario.

esempio : su un array di Elettrodomestici

Elettrodomestico[] el = new Elettrodomestico[2];

puoi specializzare ogni elemento dell'array come preferisci:

el[0] = new Aspirapolvere();
el[1] = new Friggitrice();

Ovviamente Aspirapolvere e Friggitrice estendono da Elettrodomestico...

scusa l'esempio poco felice :( ma è l'unica cosa che mi viene in mente di lunedi' mattina!

lelefante
27-01-2003, 10:50
E' possibile fare questo:
Figlio p = new Padre();


No, non e' una cosa possibile (e non ha nemmeno molto senso, secondo me), perche' la classe figlio e' piu' specializzata di padre, quindi puo' contenere membri non presenti in Padre.
Non importa che tu, nel momento in cui programmi, ti assicuri che cio' non avvenga, il linguaggio non ti puo' permettere una cosa simile, sarebbe un grosso errore.
E' comunque possibile il contrario, cioe' istanziare la classe Padre, a partire dal figlio:

Padre p = new Figlio();

in tal caso p fara' riferimento solo ai membri utilizzabili nella definizione di Padre, tuttavia, essi punteranno, effettivamente, a quelli dichiarati in Figlio.

Fausto81
27-01-2003, 10:57
Si effetivamente avevo le idee confuse..........

ma che vantaggi ti porta istanziare la classe Padre, a partire dal figlio?

E' uguale a istanziare direttamente il padre da un oggetto padre?

Grazie.........

lelefante
27-01-2003, 11:37
No, non e' uguale, se nella classe figlio ridefinisci qualcosa (sia vadiabili che metodi) l'oggetto p cosi' istanziato

Padre p = new Figlio();

Fa riferimento ai metodi e alle variabili della classe Figlio.
Tuttavia se la classe Figlio aggiunge dei membri, questi non saranno visibili all'oggetto p, ma potranno diventarlo nel caso di un casting esplicito:

Padre p = new Figlio();
Figlio n = (Figlio)p;

In questo esempio p puo' accedere ai metodi e alle variabili di Figlio che sono dichiarate in Padre, mentre n puo' accedere a tutti i membri di Figlio, indistintamente.

Quanto all'utilita' non ti saprei dire, ma e' una cosa da usare con parsimonia, per due motivi:
1) Come ti ho detto anche se dichiari p Padre, ma lo istanzi come figlio, e' un oggetto di tipo figlio ad essere istanziato (quindi con probabile aumento di consumo di memoria)
2) Comunque utilizzi i metodi di figlio, nel caso essi siano ridefiniti rispetto alla classe Padre, questo potrebbe non essere il comportamento di cui hai bisogno.

Fausto81
27-01-2003, 11:46
Grazie mille ora ho capito........

Ultima cosa.........se Padre è una classe astratta.....?

Secondo me il programma va in errore........Giusto....?


Cmq se hai dei link sul argomento me li puoi passare, x' su queste cose devo preparare un esame..........

Cmq grazie Mille.....

lelefante
27-01-2003, 12:10
Se Padre e' una classe astratta non e' direttamente istanziabile, ma se Figlio ne ridefinisce tutti i metodi astratti puoi istanziare Figlio, chiaramente.

Per tornare al discorso di prima, un valido utilizzo pratico di questa tecnica puo' essere il passaggio di argomenti ad un metodo. Se, ad esempio tu scrivi una classe che deve maneggiare un certo tipo di oggetti, ma vuoi lasciare ad altri la possibilita' di personalizzare gli oggetti, scrivi una classe astratta che stabilisce cio' di cui tu hai bisogno, e utilizzi quella classe per passare l'oggetto come argomento.


public class Figlio extends Padre }
public void metodoInterno() {
//qui fornisci una implementazione del metodo astratto
}
}

public class Main {
public void metodo1(Padre p) {
p.metodoInterno();
}
.
.
//nella classe principale puoi fare cosi'
Figlio f = new Figlio();
metodo1(f);
.
}


Come vedi metodo1 accetta come parametro un oggetto Padre, una classe astratta definita da te, per assicurarti che in essa esista un metodo chiamato metodoInterno()
Il compito di fornire un'implementazione per quel metodo spetta a un altro programmatore, che scrive una nuova classe, la quale estende Padre, In questo caso un oggetto figlio puo' essere passato come argomento a metodo1().

Spero di essere stato abbastanza chiaro. Non saprei che link darti, io di solito faccio le ricerche nei siti delle universita', in cui si posso no trovare le lezioni on-line (a volte).
Comunque un modo molto efficace per imparare e' provare a fare questi esempi e far stampare una stringa a video dentro ogni costruttore, e dentro ogni metodo, cosi' puoi vedere che parti di codice vengono eseguite.

Fausto81
27-01-2003, 13:41
Grazie mille ora ci sono.........

Loading