Visualizzazione dei risultati da 1 a 10 su 20

Discussione: polimorfismo per dati

Hybrid View

  1. #1
    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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  2. #2
    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

  3. #3
    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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java 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 © 2026 vBulletin Solutions, Inc. All rights reserved.