Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ieri; ultima lezione di sistemi del semestre, il professore punta a concludere un infarinatura generale d'ingegneria del software mediante la spiegazione di Java. Ultimi argomenti override, upcasting e polimorfismo. Un ottima occasione per fare un ripasso generale di java, un linguaggio che mi è capitato di usare molto di rado, ripreso in mano per la voglia di sviluppare per Android.
Dopo la spiegazione del polimorfismo arriva a farci soffermare su un punto che contraddistingue i linguaggi con paradigma orientato agli oggetti da altri tipi di paradigma come quello strutturato del C, sto parlando del dynamic binding. Strumento che sostituisce il binding classico di funzioni nei linguaggi che supportano il polimorfismo.
Ha spiegato che il dynamic binding deve portare un metodo che supporta un argomento classe madre a saper interpretare quale siano i "sotto-metodi" da richiamare in runtime.
Ora nasce nella mia testa una domanda, per porla al meglio lasciate che vi esponga un esempio.
Tre classi, una madre e due che la estendono, piu ovviamente la classe base del programma. La domanda ora è molto semplice, quando vado a creare un istanza di un oggetto la vm si occupa di allocare lo spazio di memoria necessario alla classe per contenere i dati prefissati, quindi avrò 3 oggetti che occupano una quantità prestabilita di memoria: Computer x parole, Microcontroller x+y parole e Laptop x+z parole, tutte che presentano un implementazione del metodo Clock.
Quando vado ad eseguire il metodo statico PrintClock, viene eseguito l'upcasting delle istanze di Microcontroller e Laptop, quindi questi due oggetti vengono trattati come delle istanze di Computer di x Parole, la parte aggiuntiva di memoria y e z non viene più considerata all'interno del metodo. Ma questo solleva un dilemma, come fa la virtual machine a eseguire il dynamic binding al giusto metodo Clock visto che con l'upcasting ha perso il riferimento alla classe di cui sono istanza gli oggetti trattati? Qual'è il sistema che usa?
Il professore non mi ha saputo rispondere, trattandosi di una domanda molto tecnica e non strettamente inerente al suo corso. Mi ha suggerito di cercare in rete facendomi notare però, che un normale manuale di Java potrebbe non rispondere a questa domanda e in caso di fallimento avrei potuto riproporla a lui stesso, che avrebbe cercato di trovare la spiegazione di questo funzionamento fondamentale dei linguaggi OOP, come il mio adorato C#(che però non mi aveva mai fatto pensare a come effettivamente si comporti in caso di polimorfismo).
Come supposto dal professore non sono riuscito a trovare una risposta, i manuali tendono giustamente a tenersi su un livello molto alto(visto che la funzione dei linguaggi come il java è proprio quella). Quindi prima di riproporre la domanda a lui, chiedo a voi, sono abbastanza convinto che qualcuno conosca la risposta a questa domanda.
Aspetto una vostra spiegazione, grazie a chiunque vorrà provare a esporre una spiegazione e buona giornata ;-)
Postato originariamente da Roby94: Ma questo solleva un dilemma, come fa la virtual machine a eseguire il dynamic binding al giusto metodo Clock visto che con l'upcasting ha perso il riferimento alla classe di cui sono istanza gli oggetti trattati? Qual'è il sistema che usa?
Grazie Piero per la tua velocità.
Ma senti dopo l'upcasting tu segni che clock non è raggiungibile è pure è quello il metodo che viene richiamato, cosi a petto come lo hai scritto te sembra che invece il metodo che si possa richiamare sia solo quello descritto nella classe computer.
Mi dispiace ma ho studiato un unico assembly molto semplificativo derivato dall'Intel x86.
Da quello che ho capito (da un riferimento C# trovato) la vtable non è altro che una simil-struttura istanziata con la classe che contiene delle informazioni strutturali della classe, tra cui un puntatore di riferimento alla classe da cui è stata istanziata. Il sistema è circa questo? Ho capito bene?