Contenuti del Corso
OOP in C++
OOP in C++
Introduzione al Polimorfismo
Polimorfismo rappresenta un concetto fondamentale. Derivato dal greco che significa "molte forme", consente agli oggetti di diverse classes
di essere trattati come un oggetto di una comune superclasse. L'aspetto più significativo è la capacità di entità diverse di rispondere ciascuna a modo proprio allo stesso messaggio o chiamata di metodo.
Tipi di polimorfismo
Esistono due principali tipi di polimorfismo: a tempo di compilazione (statico) e a tempo di esecuzione (dinamico). Comprendere come e quando utilizzare ciascuno è fondamentale per scrivere codice flessibile ed efficiente.
Polimorfismo a tempo di compilazione: si verifica tramite l'overloading di funzioni o operatori, dove il metodo da eseguire viene determinato durante la compilazione.
Polimorfismo a tempo di esecuzione: utilizza funzioni virtuali, consentendo alle classi derivate di sovrascrivere i metodi della classe base, con la scelta del metodo corretto effettuata a runtime.
Applicazione e necessità del polimorfismo
Un ottimo modo per comprendere il polimorfismo è attraverso un'analogia reale. Si consideri un'interfaccia grafica con un pulsante. Questo pulsante può comportarsi in modo diverso a seconda del contesto—potrebbe funzionare come pulsante di caricamento, pulsante di reset o pulsante di annullamento.
Ogni pulsante esegue un'azione distinta quando viene cliccato, ma tutti essenzialmente fungono da pulsanti. Osserva l'implementazione teorica di questo concetto.
UploadButton.h
ResetButton.h
CancelButton.h
class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } };
Considerando che tutti i pulsanti condividono lo stesso metodo onClick()
con implementazioni differenti, approfondiamo ulteriormente. E se avessimo bisogno di una funzione che accetti un oggetto appartenente a una delle classes
di pulsanti come parametro?
main.cpp
void user_clicked_upload_button(const UploadButton& btn) { btn.onClick(); } void user_clicked_reset_button(const ResetButton& btn) { btn.onClick(); } void user_clicked_cancel_button(const CancelButton& btn) { btn.onClick(); }
Come puoi vedere, creare manualmente funzioni separate per ogni pulsante può creare complessità, specialmente durante le modifiche, poiché ogni funzione deve essere modificata individualmente se si presentano problemi. Inoltre, nella funzione principale, saranno necessari controlli aggiuntivi per determinare quale funzione chiamare. La polimorfismo consente di risolvere facilmente questi problemi.
Grazie per i tuoi commenti!