Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Ereditarietà

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    97

    Ereditarietà

    come mai una superclasse può essere assegnata ad una sottoclasse?

    qui : http://www.math.unipd.it/~laurap/did...na11_6pgbn.pdf
    ho trovato :
    Può esserci la necessità di memorizzare un riferimento di una sottoclasse in un riferimento a superclasse.
    Ma quale può essere questa necessità?

    questo codice :
    codice:
    class SottoClasse extends SuperClasse {
    	public void qualcosa (){}
    }
    public class SuperClasse {
    	public static void main(String[] args) {
    		SottoClasse ssc = new SottoClasse();
    		SuperClasse sc = new SuperClasse();
    		sc = ssc;
    		ssc.qualcosa();
    		sc.qualcosa();
    	}
    }
    Compila e funziona. sc dopo l'assegnamento è diventata SottoClasse. Non riesco a capire questo funzionamento, mi sembra che l'ereditarietà venga rovesciata.
    Inoltre sebbene getClass mi dica che sc è SottoClasse non vedo (giustamente) il metodo perchè in teoria non è della sua classe.
    Allora perchè è permesso questo assegnamento??
    E la reflection dopo ha senso?


  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    come mai una superclasse può essere assegnata ad una sottoclasse?
    Veramente è il contrario ed il codice, correttamente, fa il contrario. Assegna una sottoclasse ad un oggetto di tipo superclasse.

    Un riferimento ad una superclasse può ricevere un oggetto di tipo SottoClasse.
    Ed è piuttosto ovvio.

    Ad un riferimento di tipo Figura posso passare qualunque Figura (un Triangolo, un Quadrato, un Cerchio, ecc)... sono tutte Figure.

    ClasseDerivata estende ClasseBase significa che ClasseDerivata è un ClasseBase, ed è ovvio: un Triangolo è una figura, un Cerchio è una Figura.

    Questo è un concetto fondamentale per la programmazione Object Oriented (che deriva dalla realtà, per di più).

    Tra parentesi, l'assegnamento non fa cambiare proprio nulla: nulla viene trasformato, semplicemente si fa riferimento ad un oggetto sottoclasse, tramite un "riferimento" di tipo "superclasse". Si ha una visibilità minore dei metodi messi a disposizione, ma non c'è nulla di così strano.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    97
    non capisco il senso però.

    Tu dici :
    ho un riferimento figura.
    gli passo un triangolo.

    Ho sempre una figura oppure ho un triangolo?

    Se faccio un getClasse ottengo un triangolo. Però non posso usare i metodi triangolo ma solo quelli di figura.

    allora qual'è il senso di permettere questo assegnamento, a livello pratico??
    Se penso di avere un triangolo e cerco di usarlo come un triangolo non ci riesco..


  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    97
    Scusa estendo il mio dubbio. In realtà non è l'ereditarietà in realtà che mi perplime ma il getClass...

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da _SC_
    non capisco il senso però.

    Tu dici :
    ho un riferimento figura.
    gli passo un triangolo.

    Ho sempre una figura oppure ho un triangolo?
    Ovviamente il tipo specifico è sempre quello istanziato, quindi hai un Triangolo (solo che lo vedi attraverso un riferimento a Figura).
    Ma al di là di questo... fa qualche differenza? Un triangolo è una figura. Se ho un triangolo, automaticamente ho anche una figura.

    Se faccio un getClasse ottengo un triangolo. Però non posso usare i metodi triangolo ma solo quelli di figura.
    Esatto, perchè stai usando un riferimento di tipo Figura.

    allora qual'è il senso di permettere questo assegnamento, a livello pratico??
    Se penso di avere un triangolo e cerco di usarlo come un triangolo non ci riesco..

    Questo è il brutto delle guide/manuali/corsi. Non c'è nessuno che faccia un esempio chiaro e utile. Quel tipo di scrittura non lo userai mai perchè è perfettamente inutile.

    Supponi di dover scrivere una classe che inserisce dentro ad un file le aree di diverse figure. Questa classe avrà un metodo che riceve la figura e salva nel file l'area calcolata di quella figura. Hai due possibilità:

    1) Scrivere una classe con un metodo per ciascun tipo di figura. Quindi, un metodo che riceve un Triangolo, un metodo che riceve un Quadrato, un metodo che riceve un Cerchio, ...

    2) Scrivere una classe con un solo metodo che riceve un oggetto Figura.

    La soluzione 1 è dispendiosa oltre ogni immaginazione e non è nemmeno scalabile. Se domani io mi invento un particolare tipo di figura, non ho un metodo di quella classe pronto a ricevere il mio oggetto e sono fregato.

    La soluzione 2 è la normalità: me ne frego di quale tipo specifico di Figura mi abbiano passato... io ne uso il metodo getArea() (che è della classe Figura e che ciascuna figura ha ridefinito opportunamente con la propria formuletta).

    codice:
    public void salvaAreaNelFile(Figura f) {
       // Non mi interessa sapere che tipo di figura...
       // Può essere un Triangolo, un Quadrato, un Cerchio o un Trapezio
       // ma essendo un oggetto Figura, sicuramente ha il metodo getArea()
    
       Double area = f.getArea();
       ...   // Salvo l'area nel file
    }
    
    ...
    
    Triangolo t = new Triangolo();
    Cerchio c = new Cerchio();
    Rettangolo r = new Rettangolo();
    
    salvaAreaNelFile( t );
    salvaAreaNelFile( c );
    salvaAreaNelFile( r );
    Questo grazie all'ereditarietà: se facessi il getClass() di quell'oggetto "f" dentro al metodo mi verrebbe restituita la classe esatta dell'oggetto passato, ma a me non interessa nulla.
    E ho invocato sempre lo stesso metodo, passandogli di volta in volta l'oggetto desiderato.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    97
    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.