Estendere linguaggi orientati agli oggetti con il Double Dispatch

Candidato: Tommaso Paba

Relatore: Prof. Betti Venneri

Correlatore: Dott. Lorenzo Bettini

In questa tesi proponiamo una tecnica per implementare automaticamente il double-dispatch in C++. In linguaggi class-based come C++ o Java, la selezione di un metodo con binding dinamico avviene esclusivamente sulla base del tipo dinamico dell'oggetto di invocazione. Con il double-dispatch, invece, la selezione viene effettuata, al momento dell'esecuzione, basandosi sia sul tipo dell'oggetto di invocazione che su quello dell'argomento. L'importanza del double-dispatch è legata al fatto che esso permette maggiore flessibilità durante la ridefinizione di un metodo nelle sottoclassi, permettendo, in particolare, la specializzazione covariante, dove il tipo dell'argomento può essere sostituito con un suo sottotipo. La tesi affronta dapprima le problematiche legate alla ridefinizione dei metodi nei linguaggi orientati agli oggetti, con particolare attenzione alle regole formali che permettono di avere un sistema di tipi corretto. Descriviamo le soluzioni adottate da linguaggi differenti per implementare la specializzazione covariante in maniera type-safe, ovvero senza che ciò introduca la possibilità di avere errori di tipo al momento dell'esecuzione, e presentiamo i multimetodi incapsulati, una soluzione, presente in letteratura e dovuta principalmente a G. Castagna, per implementare il multiple-dispatch in un linguaggio class-based. Successivamente, descriviamo il Visitor Pattern, un pattern sovente utilizzato per implementare il double-dispatch in C++. Prendendo spunto dall'idea alla base di tale pattern e dalla semantica dei multimetodi incapsulati, descriviamo una serie di trasformazioni che possono essere effettuate su una determinata struttura di classi, e che consentono di scrivere metodi con double-dispatch. Definiamo, inoltre, un algoritmo utilizzabile in un preprocessore per automatizzare tale processo. Infine, esaminiamo gli altri approcci esistenti al problema e proponiamo un confronto critico con la nostra soluzione.