Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    polimorfismo e dynamic binding

    Dunque leggendo un capitolo sulle interfacce in Java ho trovato:
    "Il collegamento tra l'invocazione di un metodo e la sua definizione , per
    un riferimento polimorfico, può avvenire solo a tempo di esecuzione.
    Infatti la definizione del metodo da usare dipende dall'oggetto puntato
    nell'istante in cui viene eseguita l'invocazione del metodo."

    allora mi chiedo:
    date 2 classi Cane,Gatto e un'interfaccia Animale

    Animale definice un metodo emetteVerso() poi implementato sia da Cane che
    da Gatto
    nel main di una terza classe Fattoria ho:

    Animale anim;

    anim=new Cane();
    anim.emetteVerso();

    anim=new Gatto();
    anim.emetteVerso();

    in questo caso Il collegamento tra l'invocazione di un metodo e la sua
    definizione avviene a tempo di esecuzione(secondo quanto detto sopra)
    ma perchè il collegamento non puo' avvenire a tempo di compilazione??
    insomma il compilatore sa che prima anim è un riferimento ad un oggetto di
    tipo Cane e dopo diventa un riferimento ad un oggetto di tipo Gatto e
    quindi il collegamento potrebbe avvenire a tempo di compilazione.
    poi mi chiedo: in un caso dove non ci sono riferimenti poliformici il
    collegamento tra l'invocazione di un metodo e la sua definizione avviene a
    tempo di compilazione??

    scusate se ho detto un mucchio di boiate ma la cosa mi è poco chiara
    grazie

  2. #2
    No: anim e' un riferimento a un oggetto di tipo Animale, che punta a un oggetto, prima di tipo Cane, poi di tipo Gatto. Ma il suo tipo rimane Animale.

    Quello postato da te e' un esempio in cui il polimorfismo non viene sfruttato. Avresti potuto dichiarare una variabile di tipo Cane e una di tipo Gatto.

    Scrivendo invece:

    codice:
    Animale[] anim = {new Cane(), new Gatto()};
    
    for (i=0; i<anim.length; ++i)
       anim[i].emetteVerso();
    si capisce l'utilita' del binding dinamico.

    Se il tuo dubbio era solo sul fatto che il compilatore non ottimizza il codice, ricordati che Java e' un linguaggio orientato al multitasking. Nessuno ti assicura che la sequenza:

    codice:
    anim=new Cane();
    anim.emetteVerso();
    non venga interrotta dall'esecuzione di un altro thread che vada a modificare anim.
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Re: polimorfismo e dynamic binding

    Originariamente inviato da Prazision
    ma perchè il collegamento non puo' avvenire a tempo di compilazione??
    Perchè la tua variabile appartiene al tipo che rappresenta la classe generica; per sapere quale metodo deve essere effettivamente richiamato, è necessario analizzare a runtime, al momento della chiamata, di quale oggetto discendente si tratta e qual è il codice effettivo da eseguire in base alla precedente condizione.

    Data la semplicità del codice che hai riportato, è lecito che tu ti stia domandando perchè il collegamento al metodo non venga eseguito in fase di compilazione...ma tieni presente che non tutti i casi sono così semplici: potresti avere a che fare con una lista di oggetti Animale, magari astratta, magari inizializzata con classi discendenti prelevate casualmente...in sostanza, l'uso del late binding è una prerogativa (non solo in Java) e viene utilizzata in tutti i casi.

    Originariamente inviato da Prazision
    poi mi chiedo: in un caso dove non ci sono riferimenti poliformici il
    collegamento tra l'invocazione di un metodo e la sua definizione avviene a
    tempo di compilazione??
    Se non ricordo male, in Java si utilizza la direttiva final per impedire che un metodo possa essere ridefinito; in tal caso, il riferimento al metodo è statico e l'invocazione avviene direttamente; in altri linguaggi, come C#, la ridefinizione è possibile solamente sui metodi virtual, cioè quei metodi per i quali viene consentito l'override, la ridefinizione.

    Originariamente inviato da Prazision
    scusate se ho detto un mucchio di boiate ma la cosa mi è poco chiara
    Dubbi leciti.
    Sicuramente qualcun altro aggiungerà altre considerazioni.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    domani guardo.grazie

  5. #5
    Utente di HTML.it L'avatar di MMarzia
    Registrato dal
    Mar 2001
    Messaggi
    1,781
    linguaggio anche nel titolo..
    io sono festosamente cicciottello :: e. cartman

    t'amo senza sapere come, nè quando nè da dove,
    t'amo direttamente senza problemi nè orgoglio:
    così ti amo perchè non so amare altrimenti

  6. #6
    grazie a tutti. effettivamente l'esempio del libro era poco azzeccato

    scusa MMarzia , l'avevo dimenticato

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.