Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: polimorfismo per dati

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315

    polimorfismo per dati

    Sto cercando di capire il polimorfismo per dati ma ho qualche dubbio.

    Un esempio del polimorfismo potrei averlo in questa riga di codice:
    codice:
    Punto ogg = new PuntoTridimensionale();
    In questo caso il reference ogg di tipo Punto conterrà un indirizzo e un intervallo di puntamento. Questo intervallo di puntamento non riguarderà la classe PuntoTridimensionale ma la classe Punto e infatti l'oggetto non potrà accedere ai metodi dichiarati nella classe PuntoTridimensionale.
    Io allora vi chiedo:
    1) che senso ha una istruzione di quel tipo? Scritta così non è equivalente a:
    Punto ogg = new Punto();
    2) per risolvere il problema del puntamento una soluzione potrebbe essere questa?
    codice:
    Punto ogg = new Punto();
    PuntoTridimensionale ogg2 = (PuntoTridimensionale) ogg;

  2. #2
    1) Non è equivalente, PuntoTridimensionale potrebbe assegnare valori a variabili inizializzate da Punto che eredita, ma che però quest'ultimo non assegna. Per esempio Punto potrebbe inizializzare la variabile "int numero_coordinate;" ma non gli assegna nessun valore (quindi di default è 0). PuntoTridimensionale erediterà questa variabile, ma potrebbe avere un costruttore di questo tipo:
    codice:
    public PuntoTridimensionale() {
          numero_coordinate = 3;
    }
    Nel secondo caso se richiami "ogg.numero_coordinate" ti restituisce 0, mentre nel primo caso ti restituisce 3.
    2) La soluzione sembra giusta.
    Ad ogni modo non sono molto bravo in questo genere di cose, quindi ti consiglio di aspettare altre risposte.
    Forza Napoli!

  3. #3
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Sto cercando di capire il polimorfismo per dati ma ho qualche dubbio.

    Un esempio del polimorfismo potrei averlo in questa riga di codice:
    codice:
    Punto ogg = new PuntoTridimensionale();
    In questo caso il reference ogg di tipo Punto conterrà un indirizzo e un intervallo di puntamento. Questo intervallo di puntamento non riguarderà la classe PuntoTridimensionale ma la classe Punto e infatti l'oggetto non potrà accedere ai metodi dichiarati nella classe PuntoTridimensionale.
    Io allora vi chiedo:
    1) che senso ha una istruzione di quel tipo? Scritta così non è equivalente a:


    2) per risolvere il problema del puntamento una soluzione potrebbe essere questa?
    codice:
    Punto ogg = new Punto();
    PuntoTridimensionale ogg2 = (PuntoTridimensionale) ogg;
    ad entrambe le domande la risposta e` una: dipende da cosa ci devi fare. Se devi manipolare punti tridimensionali e solo quelli e` necessario specificare il sottotipo. Se invece maneggi oggetti che estendono Punto ma non sono necessariamente istanze di PuntoTridimensionale allora e` corretta la prima.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Un esempio del polimorfismo potrei averlo in questa riga di codice:
    codice:
    Punto ogg = new PuntoTridimensionale();
    Piccola nota: se Punto rappresenta un punto 2D (quindi x,y) e PuntoTridimensionale lo estende aggiungendo la z .... allora la ereditarietà è sbagliata a priori concettualmente: un punto 3D NON è un caso "particolare" di punto 2D.

    Quote Originariamente inviata da newutente Visualizza il messaggio
    2) per risolvere il problema del puntamento una soluzione potrebbe essere questa?
    codice:
    Punto ogg = new Punto();
    PuntoTridimensionale ogg2 = (PuntoTridimensionale) ogg;
    Se PuntoTridimensionale estende Punto, la seconda riga è tecnicamente corretta per il compilatore (e compila) (ogg potrebbe fare riferimento ad un oggetto PuntoTridimensionale) ma a runtime il downcast fallirà sempre, perché l'oggetto realmente istanziato è un Punto (l'hai assegnato poco prima ...), che ovviamente non è un PuntoTridimensionale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quoto quanto detto fino ad adesso, ma integro ulteriormente le risposte.
    Punto ogg =newPunto();
    PuntoTridimensionale ogg2 =(PuntoTridimensionale) ogg;
    Questa istruzione non compila neanche come fa un "Punto" ad essere "PuntoTridimensionale".
    E' vera all'incontrario ovviamente cioè un PuntoTridimensionale può essere un Punto (basta ignorare la coordinata 0).
    Seconda cosa il polimorfismo è molto utile in tantissimi casi.
    Per esempio pensa di dover disegnare sia oggetti della classe Punto sia oggetti della classe PuntoTridimensionale.
    Prima di tutto avendo definito un'ereditarietà tra essi ottieni la possibilità di avere delle Collection ( o array ) omogenei; secondo supponi di aver definito in punto il metodo disegna(), che ovviamente disegnerà il punto con le sole coordinate x e y e supponi sempre che dentro la classe PuntoTridimensionale sovrascrivi il metodo disegna aggiugendo anche la profondità.
    Adesso se tu hai un array di punti (cioè della classe punto) ti basta richiamare su di essi il metodo disegna() senza preoccuparti se bisogna disegnare la profondità ad un punto + tosto che no.


  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Piccola nota: se Punto rappresenta un punto 2D (quindi x,y) e PuntoTridimensionale lo estende aggiungendo la z .... allora la ereditarietà è sbagliata a priori concettualmente: un punto 3D NON è un caso "particolare" di punto 2D.
    hai perfettamente ragione, ho utilizzato quell'esempio giusto per capire.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se PuntoTridimensionale estende Punto, la seconda riga è tecnicamente corretta per il compilatore (e compila) (ogg potrebbe fare riferimento ad un oggetto PuntoTridimensionale) ma a runtime il downcast fallirà sempre, perché l'oggetto realmente istanziato è un Punto (l'hai assegnato poco prima ...), che ovviamente non è un PuntoTridimensionale.
    E come si può risolvere il problema dell'area di puntamento?
    Quello che non mi è chiaro è cosa fa esattamente questa istruzione:
    Punto ogg = new PuntoTridimensionale();
    Cioè viene innanzitutto creato un reference di tipo Punto, a quel punto si passa al reference un oggetto di tipo PuntoTridimensionale e quindi il reference a quel punto conterrà un indirizzo di memoria (dove si trova l'oggetto) e un'area di puntamento. Quest'area di puntamento in teoria dovrebbe essere quella di PuntoTridimensionale visto che voglio poter accedere tramite ogg ai membri di PuntoTridimensionale, ma in realtà non è così e vorrei capire il perchè.

    EDIT: l'area di puntamento la "prende" da ciò che si trova a sinistra dell'uguale? scusate per la rozzezza ma voglio capire.
    Ultima modifica di newutente; 17-11-2014 a 18:01

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    mi sa che è sfuggito anche questo post.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Quello che non mi è chiaro è cosa fa esattamente questa istruzione:
    Punto ogg = new PuntoTridimensionale();

    Cioè viene innanzitutto creato un reference di tipo Punto, a quel punto si passa al reference un oggetto di tipo PuntoTridimensionale e quindi il reference a quel punto conterrà un indirizzo di memoria (dove si trova l'oggetto) e un'area di puntamento.
    'ogg' è una variabile di tipo "reference" a Punto. Dove è fisicamente nella memoria dipende dal contesto in cui è dichiarata, se è una variabile "locale" ad un metodo/costruttore, allora è allocata sullo stack, altrimenti se è una variabile di istanza/di classe, è allocata sul heap.
    Ma a parte questo è genericamente uno spazio di memoria di tot bit (quanto occupa un reference a runtime non è ora importante e dipende da vari fattori).

    Dopo aver istanziato un PuntoTridimensionale si ha quindi un reference a quest'oggetto e il valore di questo reference (qualunque esso sia e con quanti bit sia) viene semplicemente assegnato alla variabile.
    La assegnazione è corretta solo se PuntoTridimensionale "è-un" Punto, ovvero se deriva da Punto. Altrimenti il compilatore si lamenterebbe ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Quindi se non ho capito male alla variabile ogg viene passato solo il valore dell'oggetto creato di tipo PuntoTridimensionale ma l'area di puntamento rimane quella di Punto. Volendo fare un esempio stupido è come se ad una variabile di tipo int che in un primo momento vale 10 assegniamo il valore 20, a quel punto il valore sarà cambiato ma il tipo sarà sempre int. E' giusto?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Quindi se non ho capito male alla variabile ogg viene passato solo il valore dell'oggetto creato di tipo PuntoTridimensionale ma l'area di puntamento rimane quella di Punto. Volendo fare un esempio stupido è come se ad una variabile di tipo int che in un primo momento vale 10 assegniamo il valore 20, a quel punto il valore sarà cambiato ma il tipo sarà sempre int. E' giusto?
    'ogg' è (detto semplicemente) uno spazio di memoria che fa da "contenitore" per un valore. È certamente un valore più speciale, non è un banale int, long o double .... è un "reference". Ma un valore lo è comunque.

    A ogg viene assegnato un valore che è il riferimento al nuovo oggetto PuntoTridimensionale. Se successivamente assegni a ogg qualunque altro riferimento ad un oggetto che "è-un" Punto, semplicemente cambi il valore che è in ogg. Senza che questo vada ad influire minimamente sull'oggetto che era referenziato prima da ogg (a parte il concetto generale che se quello che era referenziato prima non è più raggiungibile in altri modi, andrà in pasto al garbage collector appena possibile).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.